使用Rest API更改报告/数据集以使用其他本地企业网关

时间:2019-08-22 13:44:10

标签: powerbi

我在PowerBi桌面上开发了一个PowerBI报表,该报表是从本地Analysis Server采购数据的。

在PowerBi服务中,我创建了一个工作区,然后安装了一个本地(企业)网关,其数据源指向同一台Analysis Server,然后从powerbi桌面发布我的报告,然后将其发布到工作区中,它会自动连接到网关,并且一切正常。

我想将这个pbix文件上传到生产工作空间,该工作空间具有不同的网关和指向我们的生产分析服务器的数据源。

所以我正在做以下事情:

使用powerbi powershell命令集将Pbix上载到生产工作区:New-PowerBIReport 当然,这很好,它没有连接任何预期的东西。

然后我尝试使用此其余API调用在报表的数据集上切换网关

https://docs.microsoft.com/en-us/rest/api/power-bi/datasets/bindtogatewayingroup

指定要绑定的GatewayID和生产分析服务器的数据源ID。

然后返回错误消息:DMTS_CanNotFindMatchingDatasourceInGatewayError

这是有道理的,因为该报告将查看开发分析服务器,而不会在产品网关上对其进行配置。

所以我想我是否可以使用API​​在报告上进行更改,并且可以使用: https://docs.microsoft.com/en-us/rest/api/power-bi/datasets/updatedatasourcesingroup

因此,使用此功能,我可以将数据库名称和服务器从开发更改为生产,并确认服务已接受此更改。

然后我想我可以再调用bindtogatewayingroup并指定我的生产网关和生产数据源,但是它仍然失败,并显示相同的消息“ DMTS_CanNotFindMatchingDatasourceInGatewayError”

经过数小时的研究,我得出的结论是,除非将两个网关上的数据源完全相同,否则不可能将报告从一个网关更改为另一个网关。

这是API的限制吗,还是我做错了什么??

2 个答案:

答案 0 :(得分:0)

您可以使用连接级参数来定义数据源(服务器名称和数据库名称),并在发布报告后使用REST API更新其值。

在报告中定义两个文本参数,我们将其命名为ServerNameDatabaseName。设置其值以指向所需的数据源。此时,当您向报表中添加数据源时,可以使用以下参数指定数据源:

enter image description here

如果需要修改现有报告,请用参数名称替换报告M代码中的服务器和数据库名称。代码看起来像这样:

let
    Source = AnalysisServices.Database(ServerName, DatabaseName, [TypedMeasureColumns=true, Implementation="2.0"]),
    Model1 = Source{[Id="Model"]}[Data],
    Model2 = Model1{[Id="Model"]}[Data],
    #"Added Items" = Cube.Transform(Model2,
        {
            {Cube.AddAndExpandDimensionColumn, "[OrdersData]", {"[OrdersData].[OrderDate].[OrderDate]", "[OrdersData].[OrderYear].[OrderYear]", "[OrdersData].[Quantity].[Quantity]"}, {"OrdersData.OrderDate", "OrdersData.OrderYear"}}
        })
in
    #"Added Items"

请注意,AnalysisServices.Database的前两个参数不是文字,而是上面定义的参数。

将此报告发布到Power BI Online时,它将根据当前参数值(例如,开发服务器的值)查找网关。但是您可以使用Update Parameters In Group REST API将此报告重定向到另一个数据源(例如您的生产服务器)。如果您的网关设置正确,则您无需执行其他任何操作,它将被自动使用。之后,您可能需要刷新模型。使用PowerShell,您可以执行以下操作:

Invoke-PowerBIRestMethod -Url 'groups/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/datasets/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/UpdateParameters' -Method Post -Body '{
  "updateDetails": [
    {
      "name": "ServerName",
      "newValue": "MyProductionServerName"
    },
    {
      "name": "DatabaseName",
      "newValue": "MyDatabaseName"
    }
  ]
}'


Invoke-PowerBIRestMethod -Url 'groups/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/datasets/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/refreshes' -Method Post

希望这会有所帮助!

答案 1 :(得分:0)

如今,有一种用于此类任务的API方法,可以更改对通过数据网关建立的Analysis服务的实时连接的需求: https://docs.microsoft.com/en-us/rest/api/power-bi/datasets/updatedatasourcesingroup#updatedatasourceconnectionrequest

用这样的身体来称呼它:

{
  "updateDetails": [
    {
      "datasourceSelector": {
        "datasourceType": "AnalysisServices",
        "connectionDetails": {
          "server": "server name mentioned in your pbix file",
          "database": "original database name used in pbix"
        }
      },
      "connectionDetails": {
        "server": "a new server name that is used on the gateway",
        "database": "potentially, another database name"
      }
    }
  ]
}