繁体   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