我们最近注意到一个问题,重新部署的 SSIS 包有时似乎不包含最新的更改...当我使用记事本搜索 dtsx 时,我在代码中看到了修改后的脚本,因此更改肯定存在。
我的假设是 SSIS 包的脚本组件最终会在过程中的某个位置编译成程序集——这很可能是因为我认为 C# 代码如果没有先编译它就无法运行。因此,理论上,如果这些程序集最终会被缓存并且不会立即被覆盖(出于某种原因),这将解释这个问题。
唯一让我认为我的理论是正确的“证据”是,如果我在某个时候继续运行包,它会突然转移到新代码。
但是,到目前为止,我还没有找到为什么以及如何发生这种情况,如果是......有人可以帮忙吗?
更新: MSDN 说:“与可以指示脚本是否已预编译的早期版本不同,所有脚本都在 SQL Server 2008 集成服务 (SSIS) 和更高版本中进行了预编译。” - 如果通过预编译它们意味着运行预编译版本而不是实际包(我认为这是因为包本身似乎没有被编译,因为代码在记事本中可见)必须有一种方法来强制引擎覆盖预编译的程序集......但是如何?
更新: SSIS 的四个核心组件之一是SQL ServerIntegration Services 服务,它是一个 Windows 服务。显然,该服务将缓存组件/任务元数据,以便 SSIS 运行时引擎可以轮询缓存以查看已安装的内容,这可能有助于加快包加载时间。但是,如果包存储在文件系统中(而不是 SQL 集成服务中)并由代理作业执行,则代理作业将使用 64 位版本的 DTEXEC 来执行包。我还没有找到任何证据表明那里会涉及任何缓存,但肯定有一些选项可以在执行的验证阶段检查许多参数,例如版本号 - 可能是有原因的。