本篇文章是Integration Services系列的第九篇,详细内容请参考原文。
简介
在前面三篇文章,我们创建了一个新的SSIS包,学习了脚本任务和优先约束,并检查包的MaxConcurrentExecutables属性。我们检查、演示并测试优先约束赋值为"成功"、"完成"、"失败"时对工作流的影响。我们学习了SSIS变量和表达式,并将它们应用到优先约束。
这一篇,we introduce fault tolerance by examining methods of task execution state management using the MaximumErrorCount and ForceExecutionResult properties.我们还会学习SSIS控制流任务错误、事件处理程序和容器之间的关系。
SSIS任务错误
打开Precedence.dtsx包。你的控制流面板如图9.1所示:
图9.1
让我们关注序列容器1。右击Script Task 4选择启用。在我们执行测试前,让我们查看序列容器1中连接Script Task 4、Script Task 2和Script Task 3之间的优先约束配置。Script Task 4和Script Task 3之间的优先约束配置如图9.2所示:
图9.2
求值运算为表达式和约束,意味着表达式和之前任务(Script Task 4)的执行状态(值)必须为True.在这个例子中,表达式——SSIS变量MyBool(布尔值)必须为True并且之前的任务必须执行失败。
Script Task 2和Script Task 3之间的优先约束配置如图9.3所示:
图9.3
求值运算为表达式,意味着表达式必须为True.在这个例子中,表达式——SSIS变量MyBool(布尔值)必须为True.优先约束等待之前任务的完成,并且忽略之前任务的执行状态。
测试执行
在BIDS调用器下按F5执行包。当提示Succeed Script Task 4时(图9.4),点击No按钮:
图9.4
如果你点击No按钮,Script Task 4会失败。然后Script Task 3显示完成消息框,点击确定按钮。你的控制流面板应该如图9.5所示:
图9.5
Script Task 4失败是因为提示时选择了No.为什么序列容器1失败?
事件"冒泡"
一个错误就是一个事件和事件冒泡。冒泡是什么?BIDS下点击包资源管理器,展开包\可执行文件\序列容器1\可执行文件,包资源管理器应该如图9.6所示:
图9.6
Script Task 4失败并引起一个错误事件。这就是为什么控制流中Task 4变红。然后错误事件传送(up the line)到序列容器1.因为序列容器内发生一个错误,所以它自己也失败(变红)。错误事件的传输(up in scope)有时叫做冒泡。错误事件没有在序列容器1中停止,它继续冒泡到Precedence包,它也失败。
One way to visualize bubbling from the Package Explorer treeview is to imagine the error event "climbing the tree (view)."错误事件的默认行为会引起控制流中的任务或容器失败并变红。
MaximumErrorCount属性
所有的任务,包括Script Task 4,都有MaximumErrorCount属性。MaximumErrorCount属性的默认值是1,意味着一次错误就会引起任务失败。我将这个属性的值修改为99,如图9.7所示:
图9.7
当我在BIDS调试器下执行包时,没有任何变化。Script Task 4还是变红,如图9.8所示:
图9.8
为什么?MaximumErrorCount属性也适用于容器。在一个任务上设置MaximumErrorCount属性没有效果。如果我将序列容器1的MaximumErrorCount属性设置为99会发生什么?如图9.9所示:
图9.9
序列容器1成功。我经常发现我需要在错误时让包失败。有时,我完全忽略错误。为什么?答案是:忽略错误并不会阻止事件处理程序。在第十篇,我会解释这项行为。MaximumErrorCount属性设置为0(图9.10),有效地忽略容器的错误。
图9.10
ForceExecutionResult属性
另一个让序列容器1成功的方法是将容器的ForceExecutionResult属性设置为非默认值("None")。在继续前行之前,将MaximumErrorCount属性设置回1。修改序列容器1的ForceExecutionResult属性为"Success",如图9.11所示:
图9.11
在BIDS调试器下执行包。出现提示信息时,让Script Task 2成功,让Script Task 4失败,接受Script Task 3完成。你的控制流应该如图9.12所示:
图9.12
即使MaximumErrorCount属性设置为1,序列容器1成功。ForceExecutionResult属性覆盖了MaximumErrorCount属性。
错误事件
控制流任务的每一次失败会引起一个错误事件。The error event properties are populated when it is raised, and these properties remain static as the event message is transmitted “up the tree.”通过添加一个脚本任务为Script Task 4创建"OnError"事件处理程序。
首先,在控制流点击Script Task 4。接着,点击事件处理程序页签(图9.13):
图9.13
事件处理程序打开,默认显示控制流所选任务对应的未配置的"OnError"事件处理程序。如图9.14所示:
图9.14
注意你可以通过点击可执行文件下拉菜单,导航到SSIS包中的其他可执行文件,如图9.15所示:
图9.15
你也可以通过事件处理程序下拉菜单,为你想创建的事件处理程序选择事件,如图9.16所示:
图9.16
可执行文件下拉菜单选择Script Task 4,事件处理程序下拉菜单选择OnError.为了配置事件处理程序,点击链接标记"单击此处为可执行文件"Script Task 4"创建一个"OnError"事件处理程序",如图9.17所示:
图9.17
点击链接为Script Task 4创建一个OnError事件处理程序。看一看OnError事件处理程序的工具箱,如图9.18所示:
图9.18
看起来很熟悉?它应该是——它就是控制流工具箱!这意味着事件处理程序提供SSIS工作流来响应事件。事件处理程序包括一组用于处理事件的变量,它们如图9.19所示:
图9.19
注意这些都是系统变量,除非你点击了显示系统变量按钮(图9.20)才会显示。
图9.20
为了演示变量在事件处理程序如何工作,拖一个脚本任务到事件处理程序。打开脚本任务编辑器,修改ScriptLanguage为"Microsoft Visual Basic 2008".点击ReadOnlyVariables属性,然后点击文体框的省略号。打开选择变量对话框,选择变量System::ErrorCode,System::ErrorDescription和System::SourceName,如图9.21所示:
图9.21
点击确定按钮,关闭选择变量窗口。脚本任务编辑器的脚本页如图9.22所示:
图9.22
点击编辑脚本按钮打开"ssisscript–Integration Services 脚本任务"编辑器。用下面的VB代码替换Public Sub Main()中的代码:
Public Sub Main() Dim iErrorCode As Integer = _ Convert.ToInt32(Dts.Variables("ErrorCode").Value) Dim sErrorDescription As String = _ Dts.Variables("ErrorDescription").Value.ToString Dim sSourceName As String = _ Dts.Variables("SourceName").Value.ToString Dim sSubComponent As String = _ "Script Task 4 OnError Event Handler" Dim sMsg As String = "Source: " & sSourceName & vbCrLf & _ "Error Code: " & iErrorCode.ToString & _ vbCrLf & _ "Error Description: " & _ sErrorDescription MsgBox(sMsg, , sSubComponent) Dts.TaskResult = ScriptResults.Success End Sub