【问题标题】:How to update a data source via the API如何通过 API 更新数据源
【发布时间】:2021-01-28 16:42:54
【问题描述】:

我混合使用了 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 错误:

找不到数据集 {guid}

我做错了什么?当 guid 来自 Power BI api 时,我无法理解如何找不到数据集。

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

【问题讨论】:

    标签: powerbi powerbi-datasource


    【解决方案1】:

    你正在使用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。

    【讨论】:

    • 改变这个仍然会导致同样的问题。两个端点返回相同的
    • 我认为这是一个红鲱鱼,重新阅读我的脚本,$DataSsourceDetails 没有在任何地方引用
    【解决方案2】:

    错误实际上是在我的 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}"
                }}
            }}
        ]
    }}
    

    【讨论】:

    • 你是如何让它工作的。在我尝试了我的方式后,我遵循了你的代码。我得到了同样的禁止错误 403 。我做了一个 login-powerbi 我得到了很好的令牌并将其添加到标题中。如果我遵循您的代码,是否需要添加任何其他标题。当我在邮递员中尝试这个时,它工作正常。
    【解决方案3】:

    我做过一个类似的项目(PS cmdlet + rest)并遇到了和你类似的问题。

    您如何连接到 API?使用服务主体,您仅限于可以进行的 api 调用(MS 的记录很差)。

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

    您最好的调试选项是: 运行 cmdlet Resolve-PowerBIError -Last 以获取有关错误的更多详细信息 或者使用 Fiddler 之类的工具来查看 API 的响应。

    【讨论】:

      猜你喜欢
      • 2019-02-08
      • 1970-01-01
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      • 1970-01-01
      • 2011-09-29
      • 2011-09-10
      • 2012-04-07
      相关资源
      最近更新 更多