本篇文章是Integration Services系列的第十二篇,详细内容请参考原文。
简介
在前一篇文章我们配置了SSIS内置日志记录,演示了简单和高级日志配置,保存并查看日志配置,生成自定义日志消息。在第十篇我们讨论了bubbling事件的行为,分享操纵事件冒泡默认行为的方法,并介绍了父子模式。
在这一篇,我们将结合已经学到的知识事件冒泡、日志记录、父子模式创建一个自定义的SSIS包日志记录模式。
回顾SSIS任务事件
打开Precedence.dtsx包。你的控制流面板应该如图12.1所示:
图12.1
从第九到第十一篇,我们关注在序列容器1。在第九篇,我们在Script Task 4和序列容器1上创建了OnError事件处理程序——我们描述为事件"监听器"。在第十篇,我们为Precedence.dtsx包添加一个OnError事件处理程序扩展了这个模式。对于每一个OnError事件处理程序,我们添加一个脚本任务来显示包含下面SSIS变量的消息对话框:
->System::ErrorCode
->System::ErrorDescription
->System::SourceName
在我们开始测试前,让我们验证和/或修改之前的Precedence.dtsx包的某些设置。首先,点击Precedence.dtsx包控制流的空白区并按F4显示属性。修改DisableEventHandlers属性为True,如图12.2所示:
图12.2
在我们做更多修改前,通过按F5在BIDS调试器下执行Precedence.dtsx包。对于"Succeed Script Task 2?"的选择不会影响演示的目的,但是现在以及这篇文章剩余部分我们会选择"是"按钮(图12.3)引起 Script Task 2成功。
图12.3
当提示"Succeed Script Task 4?"时,选择否按钮从Script Task 4引起一个错误事件:
图12.4
当Script Task 4产生一个错误事件,在第九篇中配置的OnError事件处理程序会忽略,因为我们在包级禁用了事件处理程序(图12.1)。下一个消息对话框显示Script Task 3完成如图12.5所示:
图12.5
接受Script Task 3的消息,让Precedence.dtsx包完成执行,最终如图12.6所示:
图12.6
如果你的Precedence.dtsx包行为如上所述,我们就已经为第十二篇准备好了。
禁用内置日志记录
我们要做的第一件事是移除SSIS包上已存在的日志记录配置。为了开始这个过程,点击SSIS下拉菜单选择日志记录,如图12.7所示:
图12.7
当打开配置SSIS日志窗口后,点击删除按钮(图12.8),删除已存在的文本日志文件配置:
图12.8
严格来说,这将停止Precedence.dtsx包上的日志记录。But I like to clean up SSIS packages,我提倡去掉配置SSIS日志中容器树下Precedence包前的复选框,如图12.9所示:
图12.9
我同时推荐删除日志文件连接管理器,如图12.10所示:
图12.10
当提示确认删除连接时,点击是按钮,如图12.11所示:
图12.11
这将会彻底清除我们在第十一篇中配置的内置日志记录。在BIDS调试器下执行包确保它按期望执行。
回顾事件冒泡
在第十篇,我们介绍了父子SSIS设计模式。我们创建一个名叫Parent.dtsx的新包,并在Parent.dtsx包的控制流添加了个执行包任务。我们配置执行包任务调用Precedence.dtsx包。在第十篇的结尾,"最后一件事"我们禁用了Precedence.dtsx包的事件处理程序(这一篇开始,也做了此操作)。然后我们在BIDS调试器下执行Parent.dtsx包,并观察Precedence.dtsx包中Script Task 4引发的错误事件消息对话框。观察到的行为是一个事件冒泡的结果。
为了回顾事件冒泡(个人认为要符合此节后续内容,Precedence.dtsx包DisableEventHandlers属性应该设置为False),从解决方案资源管理器打开Parent.dtsx。我喜欢配置BIDS环境查看父子包更方便。左键按住Precedence.dtsx页签,并将它往操作面板拖动,当你看到一个小页面时放开左键,你就会被提示新建水平或垂直选项卡组。选择新建垂直选项卡组,如图12.12所示:
图12.12
BIDS会调整包如图12.13所示,让接下来的父子执行更方便:
图12.13
点击Parent.dtsx包的控制流面板的空白区,确保选择了Parent.dtsx.按F5执行Parent.dtsx包,会调用Precedence.dtsx,Script Task 2选择是,Script Task 4选择否。接受Script Task 4和序列容器1的OnError事件处理程序产生的事件处理程序消息。接受Script Task 3提示的完成消息对话框。执行应该完成并且BIDS应该如图12.14所示:
图12.14
在Precedence.dtsx,注意Script Task 4失败,序列容器1成功。在Parent.dtsx,注意执行包任务失败。因为序列容器1的ForceExecutionResult属性保持设置为"Success"。注意接下来Parent包的OnError事件处理程序的执行,如图12.15所示:
图12.15
这里我会指出几件有趣的事。首先,在父子SSIS设计模式,错误事件从Precedence.dtsx包的底部(Script Task 4)冒泡到Parent.dtsx包的顶部。Figure 12.16 shows my “artist’s concept” of what is really and truly happening here.The Precedence.dtsx package acts as if it is "in scope" of the Parent.dtsx package’s Execute Package Task——仿佛它是执行包任务中的一个可执行文件虚拟文件夹。在真实环境,你不可能看到图12.16所示关系的包资源管理器。执行包任务不包含一个可执行文件虚拟文件夹,and if they did you would not see the Package Explorer from the child package included therein (at least not in a current version of SSIS at the time of this writing). 图形代表父子SSIS设计模式的事件冒泡行为:
图12.16
其次,错误事件,Script Task 4最初产生,一直保持原始变量的值。错误代码、错误描述、源保持静态。哪怕它从子包冒泡到父包,如图12.17所示:
图12.17
这种行为适用于所有的SSIS任务事件,不只是OnError事件。现在让我们把事件冒泡为我们工作。
准备父子SSIS设计模式日志记录
首先,我们需要一个日志记录的数据库库和表。让我们创建一个名为"SSISStairwayConfig"的数据库,我使用代码12.1创建这个数据库:
Use master go /* SSISStairwayConfig database */ If Not Exists(Select name From sys.databases Where name = 'SSISStairwayConfig') begin print 'Creating SSISStairwayConfig database' Create Database SSISStairwayConfig print 'SSISStairwayConfig database created' end Else print 'SSISStairwayConfig database already exists.' print '' go