如何通过 API 更新数据源

How to update a data source via the API

我混合使用 powershell powerbi 管理库和其他 api 来更新数据源。 (如此处记录 - https://docs.microsoft.com/en-us/rest/api/power-bi/datasets/updatedatasourcesingroup#datasourceconnectiondetails

https://api.powerbi.com/v1.0/myorg/groups/{0}/datasets/{1}/Default.UpdateDatasources 更新数据源。我正在传递 {0} 的工作区 ID 和 {1} 的数据集 ID。

$datasets = Get-PowerBIDataset -WorkspaceId $workspaceObj.Id
foreach($dataset in $datasets)
{
    $DatasetId = $dataset.Id.Guid

    $json = 
@'
{{
    "updateDetails": [{{
            "datasourceSelector": {{
                "datasourceType": "AnalysisServices",
                "connectionDetails": {{
                    "server": "{0}",
                    "database": "{1}"
                }}
            }},
            "connectionDetails": {{
                "server": "{0}",
                "database": "{1}"
            }}
        }}
    ]
}}
'@
    $json = [string]::Format($json, $AasServer, $modelName)
    $apiDatasetUrl = [string]::Format('https://api.powerbi.com/v1.0/myorg/groups/{0}/datasets/{1}/Default.UpdateDatasources',$workspaceObj.Id , $DatasetId)
    Invoke-RestMethod -Headers $headers  -Method 'Post' -Body $json -Uri $apiDatasetUrl -ContentType 'application/json'
}

这会导致 404 错误:

Dataset {guid} is not found

我做错了什么?当 guid 来自 Power BI api.

时,我无法理解如何找不到数据集

我也试过在 json 正文中包含 "datasourceId" 和 "gatewayId",但这没有效果。

您正在使用 Dataset - Get Datasources:

$getUrl = [string]::Format('https://api.powerbi.com/v1.0/myorg/datasets/{0}/datasources',$DatasetId)

同时(因为您是从某个工作区 $datasets = Get-PowerBIDataset -WorkspaceId $workspaceObj.Id 获取数据集)您应该使用 Datasets - Get Datasources In Group 并且端点 URL 应该是这样的:

https://api.powerbi.com/v1.0/myorg/groups/{groupId}/datasets/{datasetId}/datasources

即您还必须提供组(工作区)ID。

我已经完成了一个类似的项目(PS cmdlets + rest)并且遇到了与您类似的问题。

您如何连接到 API?使用服务主体,您只能进行 api 次调用(MS 对此的记录很差)。

“404 not found”在我看来似乎是您无权更改数据集。您可以尝试使用 Login-PowerBI 以用户身份登录,看看是否会得到不同的响应。

调试的最佳选择是: 运行 cmdlet Resolve-PowerBIError - 最后获取错误的更多详细信息 或者使用像 Fiddler 这样的工具来查看 API.

的响应

错误其实在我的JSON,第一个connectionDetails是现有数据源的确切规范。第二个 connectionDetails 包含要更新的详细信息。更正见下文(大写)

    $json = 
@'
{{
    "updateDetails": [{{
            "datasourceSelector": {{
                "datasourceType": "AnalysisServices",
                "connectionDetails": {{
                    "server": "MY-OLD-SERVER-NAME",
                    "database": "MY-OLD-MODEL-NAME"
                }},
      "datasourceId": "{2}",
      "gatewayId": "{3}"
            }},
            "connectionDetails": {{
                "server": "{0}",
                "database": "{1}"
            }}
        }}
    ]
}}