有没有办法让子包独立写入catalog.operation_messages?

Is there a way to make child packages write independently to catalog.operation_messages?

我继承了很多遵循这种结构的 SSIS 包:

在每个组中,一个主包由 SQL 服务器作业执行。 主包(除了一些最小的日志记录操作)只包含几十个 ExecutePackage 任务。这些调用子包,ExecuteOutOfProcess False。

ExecutePackage 任务有时是按顺序排列的(与 OnCompletion 约束相关联),但有时是高度并行的:例如,一个序列容器包含 40 个 ExecPackage 任务,没有约束来控制它们的执行顺序。

这使得调试问题变得非常困难。 SSISDB.catalog.operation_messages 是我的朋友。但似乎只有主包向 catalog.executions 写入一行,所有子包的所有消息最终都混合在属于主包的 operation_id 下。有时消息中的组件名称给了我一个线索:但以前的开发人员在克隆包时经常没有更改组件名称,所以即使那样也会产生误导。

如果每个子包都可以写自己的 catalog.executions 行,那么它的所有消息都将在 operation_id 下(execution_id 在 catalog.executions table)。有什么办法吗? ExecuteOutOfProcess=True 会这样做吗?它有什么缺点吗?

您肯定不想设置ExecuteOutOfProcess=true。这将为每个 prackage 启动一个名为 "DTS - surrogate service" 的新 windows 进程。这将花费额外的时间来启动子程序包,并且不会影响以任何方式在目录中登录。

您在现有流程中所做的是 SSIS 强制在容器中使用唯一名称,并且事件消息有一个名为 "execution path," 的 属性,它将使您到达任务的精确位置.所以这应该有助于跟踪异常 - 上下文 link 也有助于提供变量值。

除此之外,重新构建它也无妨。考虑:

  • 将相关任务分组到子主包中
  • 使用 executesql 任务和数据流而不是包,其中包除了数据流在其中执行的容器外什么也没有。换句话说,解开意大利面。
  • 将通用名称替换为有意义的名称。而不是 "Execute Package 1," 尝试 "Load customer data into staging"
  • 正在将可重启性添加到进程中。这可以通过控件 table 来完成,它会给出流程失败位置的高级图片。
  • 暂存数据 并使暂存 table 宽容。例如,如果您有一个需要转换为日期的字段,但有时它有无效值,那么将它放入暂存 table 中的字符串列是很好的,这样您就可以找到导致最终转换错误。