问题描述
我想使用PowerBI Rest API将报告从NodeJS后端连接到azure表存储。
让我们举一个基本的例子:
我已经创建了一个报表,并使用Power BI Desktop将其手动连接到Azure表。
现在,我想复制此报告,但使用另一个Azure表存储(相同的数据结构,只有值会更改)来更改其源。
我如何进行:
- 克隆报告。
- 克隆数据集。
- 更新数据集参数(放入新的Azure表凭据)。
- 将克隆的报告参数更新为新的更新数据集。
用于1 。我可以使用Clone Report。
对于2 :我不知道如何使用Power Rest API复制数据集(我应该创建新的数据集吗?)。
对于3 :我发现了这个Update API,但是关于如何格式化正文请求的详细信息并不多。
对于4 :Update report datasource。
是否有可能自动使连接的PBI数据集-天蓝色表存储?
还有另一种方法吗?
解决方法
Clone Report API将创建新报告,但是它将在同一数据集上。要使用自己的数据集创建新报告,必须使用Post Import API重新发布。您也可以使用Export Report API下载原始报告。从头开始创建数据集更加困难-创建所有表,它们的模式,关系,数据源和许多其他细节。您可以使用Post Dataset API进行操作。如果这样做,则可以使用Rebind API将报告重新绑定到新数据集。
当数据源是Azure Table时,我不知道主体请求的确切架构。这是PowerShell的一个示例,如何对SQL Server数据源执行此操作:
Import-Module MicrosoftPowerBIMgmt
# Fill these ###################################################
$workspaceName = "Awesome Reports"
$datasetName = "Awesome Report"
$sqlDatabaseServer = "mycompany.database.windows.net"
$sqlDatabaseName = "CompanyData"
$username = "user@example.com"
$password = "strong password" | ConvertTo-SecureString -asPlainText -Force
################################################################
$credential = New-Object System.Management.Automation.PSCredential($username,$password)
Connect-PowerBIServiceAccount -Credential $credential | Out-Null
$workspace = Get-PowerBIWorkspace -Name $workspaceName
$dataset = Get-PowerBIDataset -WorkspaceId $workspace.Id -Name $datasetName
$datasource = Get-PowerBIDatasource -WorkspaceId $workspace.Id -DatasetId $dataset.Id
# Construct url
$workspaceId = $workspace.Id
$datasetId = $dataset.Id
$datasourceUrl = "groups/$workspaceId/datasets/$datasetId/datasources"
# Call the REST API to get gateway Id,datasource Id and current connection details
$datasourcesResult = Invoke-PowerBIRestMethod -Method Get -Url $datasourceUrl | ConvertFrom-Json
# Parse the response
$datasource = $datasourcesResult.value[0]
$gatewayId = $datasource.gatewayId
$datasourceId = $datasource.datasourceId
$sqlDatabaseServerCurrent = $datasource.connectionDetails.server
$sqlDatabaseNameCurrent = $datasource.connectionDetails.database
# Construct url for update
$datasourePatchUrl = "groups/$workspaceId/datasets/$datasetId/Default.UpdateDatasources"
# create HTTP request body to update datasource connection details
$postBody = @{
"updateDetails" = @(
@{
"connectionDetails" = @{
"server" = "$sqlDatabaseServer"
"database" = "$sqlDatabaseName"
}
"datasourceSelector" = @{
"datasourceType" = "Sql"
"connectionDetails" = @{
"server" = "$sqlDatabaseServerCurrent"
"database" = "$sqlDatabaseNameCurrent"
}
"gatewayId" = "$gatewayId"
"datasourceId" = "$datasourceId"
}
})
}
$postBodyJson = ConvertTo-Json -InputObject $postBody -Depth 6 -Compress
# Execute POST operation to update datasource connection details
Invoke-PowerBIRestMethod -Method Post -Url $datasourePatchUrl -Body $postBodyJson
可能您可以使用Get Datasources API来查看原始数据集的外观,并更新上面的示例。但是,您可以使用参数来指定数据源,而不必使用此API,因此您将能够使用相同的Update Parameters API重定向数据源。
如果数据源的凭据存储在服务中,则可能需要patch them,例如:
Import-Module MicrosoftPowerBIMgmt
# Fill these ###################################################
$workspaceName = "Awesome Reports"
$datasetName = "Awesome Report"
$sqlDatabaseServer = "mycompany.database.windows.net"
$sqlDatabaseName = "CompanyData"
$username = "user@example.com"
$password = "strong password" | ConvertTo-SecureString -asPlainText -Force
################################################################
$credential = New-Object System.Management.Automation.PSCredential($username,$password)
Connect-PowerBIServiceAccount -Credential $credential | Out-Null
$workspace = Get-PowerBIWorkspace -Name $workspaceName
$dataset = Get-PowerBIDataset -WorkspaceId $workspace.Id -Name $reportName
$workspaceId = $workspace.Id
$datasetId = $dataset.Id
$datasources = Get-PowerBIDatasource -WorkspaceId $workspaceId -DatasetId $datasetId
foreach($datasource in $datasources) {
$gatewayId = $datasource.gatewayId
$datasourceId = $datasource.datasourceId
$datasourePatchUrl = "gateways/$gatewayId/datasources/$datasourceId"
Write-Host "Patching credentials for $datasourceId"
# HTTP request body to patch datasource credentials
$userNameJson = "{""name"":""username"",""value"":""$sqlUserName""}"
$passwordJson = "{""name"":""password"",""value"":""$sqlUserPassword""}"
$patchBody = @{
"credentialDetails" = @{
"credentials" = "{""credentialData"":[ $userNameJson,$passwordJson ]}"
"credentialType" = "Basic"
"encryptedConnection" = "NotEncrypted"
"encryptionAlgorithm" = "None"
"privacyLevel" = "Organizational"
}
}
# Convert body contents to JSON
$patchBodyJson = ConvertTo-Json -InputObject $patchBody -Depth 6 -Compress
# Execute PATCH operation to set datasource credentials
Invoke-PowerBIRestMethod -Method Patch -Url $datasourePatchUrl -Body $patchBodyJson
}