在一个 SSIS 项目中,我执行了许多 usp 来存储行计数器,例如在 ETL 过程中提取的行数、插入的行数等。
我的 SSIS 项目设置为通过代理作业运行。程序包运行正常,没有任何错误,但我所有的行数都记录为 0。当我在调试模式下运行项目时,一切都正常,计数器也正确。因此,我认为这是代理作业的权限问题,但一切都在正常执行,并且正在写入计数器日志,只是没有更新。
我对代理作业执行进行了跟踪(请原谅,它更快),可以看到 sp 调用正在执行,并且传入了 0。因此代理作业、sp 和 ssis 项目正在执行要求它们执行的操作.
要做到的两个关键点:
- 我的行计数变量通过脚本任务冒泡到父包,父包执行 sp 来记录行计数。但由于它在调试模式下工作,我认为这部分没问题。
- 我已将属性 ProtectionLevel 设置为 EncryptSensitiveWithPassword。这是我第一次使用此属性值,我认为当从代理作业执行项目时,它可能会阻止脚本任务中的代码运行。
有人可以就此提供一些建议吗?为什么代理作业执行不会记录行计数,但调试模式会?如果此属性设置阻止脚本任务运行,我该如何启用它?
提前感谢您提供的任何帮助。
编辑:
我不知道这是否有任何相关性,但这个项目是在开发服务器上构建的,并部署到 SSISDB 所在的实时服务器上,代理作业在其中执行。
这似乎归结为项目的 TargetServerVersion 属性。我没有意识到的是,在升级 SSDT 的地方,TargetServerVersion 默认为“SQL Server 2017”,而我的目标实例是 2016。
我最初尝试“降级”原始项目中的目标服务器版本,但仍然遇到同样的问题。我还收到了一些关于子包中脚本任务的信息性消息,说“降级”时有些事情没有按计划进行。我最终重新创建了整个项目,从一开始就将 TargetServerVersion 设置为 2016。这已经成功了,因为一切都在按预期工作。
我唯一改变的另一件事是我使用 SQL Server 2016 部署向导部署项目,而不是像以前那样使用 2017。但是,我不太确定这会是问题所在。
这个故事的寓意,总是检查你的 TargetServerVersion。
我已经提供了这个作为答案,以防其他人遇到这样的问题。如果将来有任何证据表明上述问题不是问题的原因,我会很乐意更改答案。