Как обновить источник данных через API - PullRequest
0 голосов
/ 23 октября 2019

Я использую комбинацию библиотеки управления PowerShell PowerShell и остальных 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} и идентификатор набора данных для {1}.

$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 приходит из API Power BI.

Я также пытался включить «datasourceId» и «gatewayId» в тело json, но это не дает эффекта.

Ответы [ 3 ]

1 голос
/ 29 октября 2019

Ошибка была на самом деле в моем 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}"
            }}
        }}
    ]
}}
0 голосов
/ 29 октября 2019

Я выполнил похожий проект (командлеты PS + отдых) и столкнулся с похожими проблемами, как у вас.

Как вы подключаетесь к API? Используя принципала обслуживания, вы ограничены звонками API, которые вы можете совершать (что плохо документировано MS).

«404 not found» мне кажется, что вы не авторизованы для внесения изменений внабор данных. Вы можете попытаться войти в систему как пользователь, используя Login-PowerBI и посмотреть, если вы получите другой ответ.

Ваши лучшие варианты для отладки: выполнить командлет Resolve-PowerBIError -Последний, чтобы получитьБолее подробную информацию об ошибке Или используйте инструмент, подобный Fiddler, чтобы увидеть ответ API.

0 голосов
/ 23 октября 2019

Вы используете Набор данных - Получить источники данных :

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

Хотя (поскольку вы получаете наборы данных из некоторого рабочего пространства $datasets = Get-PowerBIDataset -WorkspaceId $workspaceObj.Id), вам следует использовать Наборы данных - Получить источники данныхВ группе URL-адрес конечной точки должен быть таким:

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

, т. Е. Необходимо также указать идентификатор группы (рабочей области).

...