用于在链接服务器上执行 DDL 语句的 Powershell 脚本 - 使用 SSIS 运行时不起作用

Posted

技术标签:

【中文标题】用于在链接服务器上执行 DDL 语句的 Powershell 脚本 - 使用 SSIS 运行时不起作用【英文标题】:Powershell script to execute DDL statements on linked servers - not working when run using SSIS 【发布时间】:2014-04-02 15:01:02 【问题描述】:

我有一个 Powershell 脚本,它遍历 SQL Server 列表并创建服务器登录名和数据库用户。

脚本在单独的服务器上运行,使用该服务器上的管理员凭据,并通过链接服务器连接到其他 SQL Server。

#Get administrator credentials
$password = get-content C:\Powershell\General\password.txt | convertto-securestring;
$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist "DOMAIN\administrator",$password;

当手动运行此脚本(直接通过 Powershell 窗口或通过命令提示符使用批处理文件)时,它运行良好。手动运行脚本时,我以管理员身份登录到执行服务器。

然后我尝试使用执行服务器上的 SSIS 包运行此 Powershell 脚本,使用执行进程任务来运行批处理文件。该包是从 SQL 代理作业执行的。尽管作业和包似乎都成功执行,但 DDL 语句并未针对链接的服务器执行。

执行服务器上的 SQL 代理在指定的服务帐户下运行。 SSIS 在网络服务帐户下运行。

有人对我可能做错了什么有任何想法吗?我很乐意提供脚本的详细信息或任何其他所需内容。

谢谢

更新:好的,我们有更多信息。

我删除了我在上面发布的行,因为我发现我实际上并不需要我正在检索的管理员凭据。

我使用服务帐户登录了带有脚本的服务器。根据@ElecticLlama 的建议,我在目标服务器上设置了 Profiler 跟踪。手动运行脚本(或手动运行运行 Powershell 脚本的批处理文件)时,一切正常,Profiler 在服务帐户登录下显示 DDL 操作。

当通过运行相同批处理文件的 SQL 代理(CmdExec 作业或 SSIS 包)运行作业时,我收到以下错误:

'用户 'DOMAIN\ServiceAccount' 登录失败。原因:基于令牌的服务器访问验证因基础架构错误而失败。'

大家还有什么想法吗?

【问题讨论】:

如果您没有收到任何其他回复,请尝试查看 CSSP。 此时我的假设是服务帐户将其执行策略设置为默认值......无论它是什么,都不允许执行脚本。您可以通过让包中的 Execute Process Task 发出 Get-ExecutionPolicy 并将输出传送回 SSIS 变量然后记录该值来验证这一点。如果是这种情况,那么解决方案是让该帐户发出Set-ExecutionPolicy,以获得比默认更好的东西。我喜欢脱裤子跑步,所以我用Unrestricted “似乎执行成功” - 要排除故障,您需要来自 SQL 代理、SSIS 和 powershell 脚本中的日志。您需要确定一切是否成功执行。 @billinkc 感谢您的建议。对于服务帐户的 32 位和 64 位版本的 Powershell,我们将执行策略设置为不受限制。不幸的是,这没有帮助。 @ElectricLlama 感谢您的意见。当然,我检查了所有的事件日志和 SQL 日志,没有发现任何错误。 【参考方案1】:

感谢大家的帮助。一旦我得到最后一个错误,快速搜索显示我只需要重新启动 SQL 代理,现在一切正常。特别感谢@ElecticLlama 为我指明了正确的方向。

【讨论】:

以上是关于用于在链接服务器上执行 DDL 语句的 Powershell 脚本 - 使用 SSIS 运行时不起作用的主要内容,如果未能解决你的问题,请参考以下文章

关于数据库

为啥这个 PL-SQL 循环只有在与 DDL 语句分开执行时才起作用?

自治事务中的 Oracle DDL

在表 Oracle DB 上执行的最后一个 DDL

SQLDataSet中执行DDL语句

ORACLE 在立即执行中批处理 DDL 语句