首页 > 解决方案 > 如何自动更改连接字符串中的服务器

问题描述

我希望能够通过不同的环境推广我的报告版本。我想自动化这个过程(使用 octopus 或 azure devops),但是我找不到如何为每个环境注入源连接设置。

我知道 .pbix 文件实际上是包含源的 zip 文件夹,但是更改文件并重新压缩它会导致错误。

编辑:在我的具体情况下,我使用的是分析服务,不幸的是,并非所有数据源都被平等对待。

标签: powerbi

解决方案


您可以通过在报表中使用特定于连接的参数来允许报表本身切换其数据源来实现此目的。为此,Power Query Editor通过单击打开Edit QueriesManage Parameters定义两个新的文本参数,让它们命名ServerNameDatabaseName

在此处输入图像描述

在此处输入图像描述

将它们的当前值设置为指向您的数据源之一,例如SQLSERVER2016AdventureWorks2016。然后在报告中右键单击您的查询并打开Advanced Editor. 在M代码中找到服务器名和数据库名:

在此处输入图像描述

并将它们替换为上面定义的参数,因此 M 代码将如下所示:

在此处输入图像描述

现在您可以关闭并应用更改,您的报告应该像以前一样工作。但是现在当您想更改数据源时,请使用Edit Parameters

在此处输入图像描述

并更改服务器和/或数据库名称以指向要用于报告的其他数据源:

在此处输入图像描述

更改参数值后,Power BI Desktop 将要求您应用更改并从新数据源重新加载数据。要更改 Power BI 服务中发布的报表的参数值(即数据源),请转到数据集的设置并输入新的服务器和/或数据库名称:

在此处输入图像描述

更改数据源后,刷新数据集以从新数据源获取数据。使用 Power BI Pro 帐户,您可以每 24 小时执行 8 次此操作,而如果数据集处于专用容量中,则此限制会提高到每 24 小时 48 次。

要以编程方式执行此操作,请使用Update Parameters/Update Parameters In GroupRefresh Dataset/ Refresh Dataset In GroupREST API 调用。例如,您可以使用 PowerShell 执行此操作,如下所示:

Import-Module MicrosoftPowerBIMgmt
Import-Module MicrosoftPowerBIMgmt.Profile

$password = "xxxxx" | ConvertTo-SecureString -asPlainText -Force
$username = "xxxxx@yyyyy.com" 
$credential = New-Object System.Management.Automation.PSCredential($username, $password)

Connect-PowerBIServiceAccount -Credential $credential

Invoke-PowerBIRestMethod -Url 'groups/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/datasets/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/UpdateParameters' -Method Post -Body '{
  "updateDetails": [
    {
      "name": "ServerName",
      "newValue": "SQLSERVER2019"
    },
    {
      "name": "DatabaseName",
      "newValue": "AdventureWorks2019"
    }
  ]
}'
Invoke-PowerBIRestMethod -Url 'groups/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/datasets/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/refreshes' -Method Post

Disconnect-PowerBIServiceAccount

更新:对于到 SSAS 的实时连接,不能使用参数。在这种情况下,可以使用Update Datasources In Group REST API 调用更改连接字符串。在 PowerShell 中,可以这样完成:

Import-Module MicrosoftPowerBIMgmt
Import-Module MicrosoftPowerBIMgmt.Profile

$password = "xxxxx" | ConvertTo-SecureString -asPlainText -Force
$username = "xxxxx@yyyyy.com" 
$credential = New-Object System.Management.Automation.PSCredential($username, $password)

Connect-PowerBIServiceAccount -Credential $credential

Invoke-PowerBIRestMethod -Url 'groups/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/datasets/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Default.UpdateDatasources' -Method Post -Body '{
  "updateDetails": [
    {
      "datasourceSelector": {
        "datasourceType": "AnalysisServices",
        "connectionDetails": {
          "server": "My-As-Server",
          "database": "My-As-Database"
        }
      },
      "connectionDetails": {
        "server": "New-As-Server",
        "database": "New-As-Database"
      }
    }
  ]
}'

Disconnect-PowerBIServiceAccount

请注意,您需要提供新旧服务器和数据库名称。


推荐阅读