1

我想使用 PowerBI Rest API 将报表从我的 NodeJS 后端连接到天蓝色表存储。

让我们举一个基本的例子:

我已经创建了一个报告并使用 Power BI Desktop 手动将其连接到 Azure Table。

现在我想复制此报告,但使用另一个 Azure 表存储更改它的源(相同的数据结构,只有值更改)。

我认为如何进行:

  1. 克隆报告。
  2. 克隆数据集。
  3. 更新数据集参数(放置新的 Azure 表凭据)。
  4. 将克隆的报告参数更新为新的更新数据集。

对于 1。我可以使用克隆报告

对于 2:我不知道如何使用 Power Rest API 复制数据集(我应该创建新数据集吗?)。

对于 3:我找到了这个更新 API,但没有太多关于如何格式化正文请求的详细信息。

对于 4更新报告数据源

是否可以自动连接 PBI Datasets-Azure 表存储?

还有另一种方法吗?

4

1 回答 1

2

克隆报告 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,因此您将能够使用相同的更新参数 API 重定向数据源。

如果数据源的凭据存储在服务中,您可能需要修补它们,例如:

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
}
于 2020-11-05T18:51:28.850 回答