簡體   English   中英

無法使用 SQL Server 代理 Powershell CmdExec 步驟處理 Power BI Premium 模型中的分區

[英]Unable to Process Partition in Power BI Premium Model Using SQL Server Agent Powershell CmdExec Step

我正在嘗試使用Analysis Services Cmdlet來處理 Power BI Premium 模型上的分區。 我的 PowerShell 腳本在從 ISE、命令行運行以及使用 Windows 任務調度程序進行調度時工作正常; 但是,當我嘗試使用 SQL Server 2019 代理作業使用操作系統 (CmdExec) 的步驟類型來安排 PowerShell 腳本時,會遇到以下錯誤消息。

消息以用戶身份執行:MyDomain\\MyUser。 Invoke-ProcessPartition :連接字符串無效。 在 C:\\Users\\MyUser\\Desktop\\PS1\\SSAS\\wtf.ps1:15 char:11 + $asResult = Invoke-ProcessPartition -Credential $UserCredential -Server...+
CategoryInfo : NotSpecified: (:) [Invoke-ProcessPartition], ConnectionException +fullyQualifiedErrorId : Microsoft.AnalysisServices.ConnectionException,Microsoft.AnalysisServices.PowerShell.Cmdlets.ProcessPartition。

我已按照此博客文章中的步驟設置作業。 所有三個運行方案都使用相同的 Windows 用戶。 SQL Server 是我本地開發的 SQL Server,其 Windows 用戶是 SQL Server 和 Windows Admin 上的 SA。 SQL 實例所在的同一台機器用於成功執行其他三種運行 PS 腳本的方式(ISE、命令行和 Windows 任務計划程序)

如果我在本地主機 SQL 服務器所在的同一台計算機上從命令行運行以下命令,PowerShell 腳本將成功運行。

PowerShell -File "C\Users\MyUser\Desktop\PS1\SSAS\wtf.ps1"

下面是我的 PowerShell 腳本修改為盡可能小以演示問題,當然敏感信息也被編輯。 在此先感謝您的幫助,我不知道如何繼續。 我真的需要它從 SQL 代理工作,所以我不必猜測處理所依賴的步驟何時完成。

$ErrorActionPreference=”Stop”

Import-Module "SqlServer"

$User = "MyUser@MyDomain.com"
$PWord = ConvertTo-SecureString -String "MyPassword" -AsPlainText -Force
$UserCredential = New-Object -TypeName "System.Management.Automation.PSCredential" -ArgumentList $User, $PWord

$server = "powerbi://api.powerbi.com/v1.0/myorg/MyWorkspace"
$db = "MyModel"

$asResult = Invoke-ProcessPartition -Credential $UserCredential -Server $server -PartitionName "DimDate" -TableName "DimDate" -Database $db  -RefreshType "Full"

我工作中的步驟代碼是:

powershell -File "C:\Users\MyUser\Desktop\PS1\SSAS\wtf.ps1"

更新:我發現,如果我以本地 SSAS 服務器為目標,則完全相同的代碼(服務器變量除外)確實可以使用 SQL Agent 方法工作,但當然切換到本地並不是我想要的.

更新 2:當我右鍵單擊 SSMS 中的作業並單擊“啟動 PowerShell”時,這會打開一個 SQL Server PowerShell 窗口。 如果我嘗試以這種方式執行腳本,則會收到以下錯誤消息。 正在使用的帳戶沒有啟用 MFA。

無法使用提供的憑據獲取身份驗證令牌。 如果您的 Active Directory 租戶管理員已配置多重身份驗證,或者您的帳戶是 Microsoft 帳戶,請從連接字符串中刪除用戶名和密碼,然后重試。 然后應該會提示您輸入憑據。

如果我不使用 SQL Server PowerShell 窗口將憑據傳遞給 Invoke-ProcessPartition 命令,系統會提示我輸入憑據並且調用有效。 當然,我不能將其用作解決方法,因為我需要它在無人看管的情況下運行。

我還嘗試打開 PowerShell ISE 作為用於在 PS 腳本中對工作區進行身份驗證的帳戶,並且它也給出與 SQL Server 代理作業相同的錯誤。

連接字符串無效。

我找到了解決問題的方法。 決議是雙重的。

第一個問題是,當從 SQL Server 代理運行 PowerShell 時,SqlServer 模塊的版本是較舊的過時版本。 我通過使用以下代碼從 SQL Server 代理作業執行 ps1 文件並查看作業歷史記錄結果發現了這一點。

Get-Command -module sqlserver invoke*

我試過跑步

Install-Module sqlserver -AllowClobber -Scope AllUsers  

作為管理員,但它沒有更新 SQL 代理正在運行的 SqlServer 模塊。 相反,我創建了一個簡單運行的 ps1 文件

 Install-Module sqlserver -AllowClobber -Scope CurrentUser -Force 

並使用 SQL Agent CMD 任務調用腳本,這更新了 SqlServer 模塊版本。 在此之后,我開始收到一條更有用的錯誤消息:

無法使用提供的憑據獲取身份驗證令牌。 如果您的 Active Directory 租戶管理員已配置多重身份驗證,或者您的帳戶是 Microsoft 帳戶,請從連接字符串中刪除用戶名和密碼,然后重試。 然后應該會提示您輸入憑據

對於這條新的錯誤消息,我決定嘗試使用 Azure 服務主體提供憑據的替代方法。 這種新方法在包括 SQL Server 代理作業在內的所有 PowerShell 方法中都取得了成功。 Power BI 文檔中概述了實施的步驟。

最終的 PS 代碼如下所示。

$ErrorActionPreference=”Stop”
Import-Module "SqlServer"
$AppId = "AAD_App_Registration_Application_Client_Id"
$TenantId = "AAD_App_Registration_Directory_Tenant_Id"
$AppSecret = "AAD_App_Registration_CertificatesAndSecrets_ClientSecret"
$PWord = ConvertTo-SecureString -String $AppSecret -AsPlainText -Force
$Credential = New-Object -TypeName "System.Management.Automation.PSCredential" -ArgumentList $AppId, $PWord

Invoke-ProcessPartition -Server "powerbi://api.powerbi.com/v1.0/myorg/MyModel" -PartitionName "DimDate" -TableName "DimDate" -Database "MyModel" -RefreshType "Full" -ServicePrincipal -ApplicationId $AppId -TenantId $TenantId -Credential $Credential

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM