我在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的限制吗,还是我做错了什么??
答案 0 :(得分:0)
您可以使用连接级参数来定义数据源(服务器名称和数据库名称),并在发布报告后使用REST API更新其值。
在报告中定义两个文本参数,我们将其命名为ServerName
和DatabaseName
。设置其值以指向所需的数据源。此时,当您向报表中添加数据源时,可以使用以下参数指定数据源:
如果需要修改现有报告,请用参数名称替换报告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"
}
}
]
}