基于SSIS事件向上传递的示例分析

62次阅读
没有评论

共计 3883 个字符,预计需要花费 10 分钟才能阅读完成。

这篇文章主要介绍了基于 SSIS 事件向上传递的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让丸趣 TV 小编带着大家一起了解一下。

在 SSIS 中,Package 是 Task 组件的有序组合,具有层次结构,Package 处于层次结构的顶层(Root Level),对于父子包结构,父包(Parent Package)通过 Execute Package Task 组件调用其他 Package,被调用的 Package 是子包,父包是子包的上层级别,最顶层的 Package,处于层次结构的顶层,叫做根包(Root Package);容器(Container)组件包含其他 Task 组件,容器是被包含的 Task 组件的父级别(Parent Level);Task 组件是层次结构的最底层,处于叶级别(Leaf Level)。事件就是沿着 Package 的层次结构向上传递的。

在 Package 中,每一个 Task 组件都是一个可执行程序(Executable),所有的数据处理任务都是由 Task 组件完成的。在 Package 运行(runtime)时,SSIS 引擎为了监控和追踪 Task 组件的运行状态,预先创建了 12 个系统事件(Event),这些事件都是在 Package 运行时(runtime)被可执行程序(Executable)触发的,每个事件都会产生相应的消息,用于描述 Executable 的运行状态,供开发工程师对 Package 进行调试和性能调优。一旦有事件被触发,SSIS 会执行相应的事件处理程序(Event Handler),SSIS 为每个事件都创建了默认的事件处理程序,命名规范是:On+EventName,用户可以创建自定义的事件处理程序,以扩展 Package 的功能,使 Package 在运行时更容易管理,以完成数据处理任务。在 ETL 开发中,最常用的事件是错误(Error)事件,该事件在 Executable 运行出现错误时触发,对应的事件处理程序是 OnError。

在 Package 的层次结构中,事件处理具有向上传递(Propagate)的特性。发生在 Task 组件的事件,首先会被该 Task 组件的 Event Handler 捕获和处理;如果该 Task 组件没有创建 Event Handler,那么 SSIS 把该 Event 向上传递到其父级别的 Executable,由其父级别的 Event Handler 来处理;如果该 Executable 有 Event Handler,那么由该 Event Handler 负责响应和处理该事件。事件会依次向上传递,直到事件被处理,或者传递到顶层被默认处理,事件向上传递的顶层是根包(Root Package)。

引用 MSDN 官方文档的例子,Package 的层次结构如下图所示:

在层次结构中,如果相应的 Task 组件没有定义事件处理程序,那么事件向上传递的过程如下图所示:

注:事件向上传递的条件是没有创建自定义的事件处理程序,默认情况下,该图示有误,事件被 Event Handler 处理之后,将继续向上传递,我会在下文详细解释。

MSDN 对图示做了说明:

If an event has no event handler, the event is raised to the next container up the container hierarchy in a package. If this container has an event handler, the event handler runs in response to the event. If not, the event is raised to the next container up the container hierarchy. Only the package has an event handler, for its OnError event. If an error occurs when the Execute SQL task runs, the OnError event handler for the package runs.

把事件依次向上传递的特性,是由事件处理程序(Event Handler)的系统变量 Propagate 控制的,变量 Propagate 的默认值是 True,这意味着,默认情况下,该事件将会被传递到上层级别的 Event Handler 中进行处理。有一个例外是在父子包结构中,子 Package 在进行包验证(Validation)时,不管子包的 Propagate 变量的值如何设置,都会把验证事件传递到父包中,父包继续执行验证。

当前 Task 组件必须创建事件处理程序,才能查看和修改变量 Propagate 的值。如果把事件处理程序(Event Handler)的 Propagate 变量设置为 False,那么该事件只会被当前的事件处理程序处理和响应,不会被传递到上层级别的事件处理程序中。但是,如果没有为“肇事”的 Task 组件创建事件处理程序(Event Handler),那么事件总是向上传递,直到被事件处理程序响应,如果 Package 的层次结构没有定义任何事件处理程序,那么事件最终被根包(Root Package)默认处理。

一,错误事件处理程序(OnError)向上传递

默认情况下,当前 Task 组件的事件处理程序中把错误(Error)事件处理之后,SSIS 引擎仍然把错误事件向上层事件处理程序传递,直到包层次结构的最顶层,如下图,在 ChildPackage 的 Package 级别和 Executable 级别上分别创建了 OnError 事件处理程序,Executable 级别是 child Execute SQL Task:

执行 Package,在 child Execute SQL Task 中触发错误事件,被该 Task 的事件处理程序捕获和处理,下图是 Executable 级别的 OnError 事件处理程序,其成功执行一个 Task:

但是,错误事件没有停止,而是继续向上传递,被其直接上级,也就是 Package 级别的 OnError 事件处理程序捕获,如下图,来自子 Task 组件的错误事件被父级处理之后,Package 仍然报错,错误消息是:Package execution completed with error.

错误事件处理程序把错误事件(Error)向上传递(Propagate)的过程类似“冒泡”,从触发错误事件的“肇事”Task 组件开始,逐级向上传递到最顶层的可执行程序(Executable),最顶层的 Executable 是 Package 本身。这意味着,如果在 Package 级别定义了一个错误事件处理程序(OnError),每当 Package 中的任意一个 Task 组件触发错误事件(Error),最终都会触发 Package 级别的错误事件处理程序。在父子包结构中,如果父 Package 通过 Execute Package Task 调用子 Package,那么,错误事件会发生相同的过程,子 Package 的错误事件会向上传递(Propagate)到父 Package 中。

二,禁用错误事件的向上传递

如果想要禁用事件的向上传递过程,可以在 Task 组件的事件处理程序中,把系统变量 Propagate 设置为 False,这样,事件将不再向上传递,只触发当前 Task 组件的事件处理程序,只有在 Task 组件中创建事件处理程序之后,才能修改系统变量 Propagate 的默认值。

1,修改系统变量 Propagate 的默认值

step1,呈现系统变量

打开 Event Handlers Tab,在 Variables 窗体中,点击网格选项(Grid Options)按钮,打开 Variable Grid Options 窗体,在 Filter 选项中勾选 Show system variables,点击“OK”,返回到 Variables 窗体:

step2,设置 Propagate 的值

在 Variables 窗体中,找到 Propagate 系统变量(Scope 是 OnError),把 Value 设置为 False

2,禁用事件处理的向上传递

禁用 Task 组件的事件处理的向上传递(Propagate)特性之后,在当前 Task 组件中触发的事件,只会被当前 Task 组件的事件处理程序捕获和处理,而不传递到上层 Task 组件的事件处理程序。

再次执行 Package,由于错误事件是被 child Execute SQL Task 触发的,其事件处理程序自动捕获并处理该 Error 事件:

而 Package 级别的事件处理程序没有捕获到 Error 事件,Package 没有执行 OnError 事件处理程序,最终的执行结果是:Package execution completed with success。

基于 SSIS 事件向上传递的示例分析

基于 SSIS 事件向上传递的示例分析

三,没有创建事件处理程序

如果没有为 Task 组件创建事件处理程序(Event Handler),那么事件总是从当前 Task 组件向上传递。用户创建事件处理程序,并不意味着,需要在其中添加 Task 组件,做数据处理任务,空的事件处理程序是允许的。在空的事件处理程序中把系统变量 Propagate 设置为 False,那么事件将不会向上传递,也不会被显式处理,错误消息仍然会被 SSISDB 记录,但强烈建议不要这样做。

感谢你能够认真阅读完这篇文章,希望丸趣 TV 小编分享的“基于 SSIS 事件向上传递的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持丸趣 TV,关注丸趣 TV 行业资讯频道,更多相关知识等着你来学习!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-04发表,共计3883字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)