【问题标题】:Possible to publish a powerbi report without password?可以在没有密码的情况下发布 powerbi 报告吗?
【发布时间】:2021-05-09 00:07:57
【问题描述】:

下午好,

我们的开发人员使用 PBI 创建了一些不错的报告,但问题是他们使用数据库 X。这些数据库仅包含开发数据。一旦他们想要发布它,我们必须调整他们的报告以使用包含生产数据的数据库 Y。

开发人员有没有办法发布他们的报告,将数据库从 X 更新到 Y,但不添加凭据? 通过这种方式,他们的报告将通过网关刷新,网关将设置为使用 UID/PWD 链接到 DB Y(用户无法访问)

谢谢:)

【问题讨论】:

    标签: powerbi powerbi-desktop powerbi-datasource


    【解决方案1】:

    好吧,毕竟有人知道数据库 Y 的密码,对吧?为什么不在 Power BI Desktop 中打开报表,更改数据源,然后发布呢?但是,当数据源仍然是开发数据库(数据库 X)时,可以选择重定向开发人员发布的报告。

    首先,他们可以使用connection specific parameters 来定义数据源。然后,在发布后,知道凭据的人会更新参数值以将数据库重定向到生产数据库并输入凭据。

    第二个不需要对报告进行任何更改。让您的开发人员发布它,然后使用Power BI REST APIchange the datasourcepatch the credentials。这可以通过使用Power BI Management CmdLets 的PowerShell 来完成。首先,以管理员身份启动 PowerShell 并通过执行以下脚本安装 CmdLets:

    Install-Module MicrosoftPowerBIMgmt
    

    如果您在计算机上没有管理员权限,或者由于某些其他原因不想为所有用户安装这些,您可以仅为当前用户安装它们:

    Install-Module MicrosoftPowerBIMgmt -Scope CurrentUser
    

    你没有提到使用什么数据库。这很重要,因此在下面的示例中,我将假设它是 SQL Server。更新前几行中的值以指向您的生产数据库和已发布的报告,然后执行脚本以更改数据源:

    # Fill these ###################################################
    $workspaceName = "The name of the workspace where the report is published"
    $datasetName = "The name of the report"
    $sqlDatabaseServer = "Server name"
    $sqlDatabaseName = "Database name"
    $username = "powerbiuser@yourcompany.com"
    $password = "the password of the power bi user" | ConvertTo-SecureString -asPlainText -Force
    ################################################################
    
    Import-Module MicrosoftPowerBIMgmt
    
    Clear-Host
    
    $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
    
    # NOTE: dataset credentials must be reset after updating connection details
    

    现在更新以下脚本开头的值并执行它以修补生产数据库的凭据:

    # Fill these ###################################################
    $workspaceName = "The name of the workspace where the report is published"
    $reportName = "The name of the report"
    $sqlUserName = "user name"
    $sqlUserPassword = "password"
    $username = "powerbiuser@yourcompany.com"
    $password = "the password of the power bi user" | ConvertTo-SecureString -asPlainText -Force
    ################################################################
    
    Import-Module MicrosoftPowerBIMgmt
    
    Clear-Host
    
    $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
    }
    
    $datasetRefreshUrl = "groups/$workspaceId/datasets/$datasetId/refreshes"
    
    Write-Host "Refreshing..."
    
    Invoke-PowerBIRestMethod -Method Post -Url $datasetRefreshUrl 
    

    【讨论】:

    • 感谢您的回答。我们正在使用 Teradata。问题是我们想为最终用户提供灵活性;我们不想,每次他们构建/更新报告时,都联系发布它(我们有超过 1000 份报告 PBI ^^)。关于我测试过的解决方案,我还尝试查看是否可以在 ODBC 中的连接字符串中添加参数(一旦完成获取数据)并且没有办法......我的想法是更改我们的参数报告发布后的网关
    • “为最终用户提供灵活性”是什么意思?不清楚你想达到什么目标。
    • 今天我们的用户可以发布他们的报告(几个人可以更新它)针对 PRD db (Y),从安全的角度来看,它不再被允许。将来,为了能够创建从 PRD db (Y) 收集数据的报告,他们必须使用自己的 DEV 数据库 (X_USER1/2/3/...)。 db X_USER1 是一个个性化的数据库,这意味着如果几个人处理报告,每个人都有自己的 DEV 数据库。 ¨问题是,如果用户想使用生产数据库设置自动刷新,我们必须更改报表上的数据库并使用数据库配置网关上的连接。
    • a) 或开发人员能够使用他们无权访问的数据库 Y 调整和发布他们的报告。问题是 PBI Desktop 需要 uid/pwd 并阻止发布。怎么跳过? b) 我们在连接字符串中使用参数:DATABASE=@MYDB;DSN=TERADATADEV 但无法在 ODBC 连接字符串上使用变量(我们可以在 Power Query 上使用它,但我们想避免这种情况,因为人们创建报告不是 IT 人员)。 c) 我们设置了一个基于 Azure Devops (CICD) 的解决方案,该解决方案链接到您提到的解决方案(脚本) d) 我们拥有所有报告的所有权......
    • 您正在寻找deployment pipelines 和他们的dataset rules
    猜你喜欢
    • 1970-01-01
    • 2012-09-14
    • 2016-05-27
    • 2017-04-01
    • 2020-02-17
    • 2017-10-29
    • 2016-04-10
    • 1970-01-01
    • 2017-07-25
    相关资源
    最近更新 更多