介绍

在前一篇文章中我们介绍了故障容差相关的 MaximumErrorCount 和 ForceExecutionResult 属性.  同时我们学习了SSIS Control Flow task errors, containers, 和event handlers联系 .

本篇中我们关注事件行为. 我们用两种方法操纵日志传递(冒泡)行为. 同时也介绍父子模式(Parent-Child pattern )并且演示事件在父子模式中的行为.

关于 SSIS 任务事件 About SSIS Task Events

打开Precedence.dtsx 包 :

图 1

在前篇文章中,我们把注意力集中在 Sequence Container 1.

我们在Script Task 4 and Sequence Container 1中创建了一个OnError 事件句柄(event handlers) – 我们称之为”接听者 listeners”. 每个 OnError event handler 我们都添加了 Script Task,并且用消息框显示下面三个OnError event handler变量:

  • System::ErrorCode
  • System::ErrorDescription
  • System::SourceName

做测试之前,我们先改动下Precedence.dtsx 的配置. 首先点击 Sequence Container 1然后把 ForceExecutionResult 设置为“Success”.然后点击 Script Task 4 把 MaximumErrorCount 设置为1.

再我们做更多改动前, 执行 Precedence.dtsx 包 .弹出“Succeed Script Task 2?” 的提示,选择 Yes :


图 2

提示 “Succeed Script Task 4?” 的时候选择No 按钮: 此时生成一个OnError 错误事件.


图 3

当 Script Task 4 处罚OnError 错误事件以后. 弹出的消息框如下:


图 4

当然 Error 事件并不听于此, 会继续冒泡到Sequence Container 1:

图 5

点击OK, 然后弹出Script Task3的消息框 .确认后,正报执行完成:

图 6

注意 Sequence Container 1 执行成功. 为什么?

事件和执行状态Events and Execution Status

因为我们前一篇文章设置 ForceExecutionResult 的属性为“Success” 并没有设置回(“None”) .  这是有意而为的,为了演示 ForceExecutionResult 属性与Sequence Container 1 及 Sequence Container 对错误事件的响应.  虽然 ForceExecutionResult 属性强制Sequence Container 1的执行结果为成功,但是这并不妨碍Sequence Container  ‘接听’错误事件. 刚才已经演示过,在本章的最后我们会告诉大家怎么忽略事件处理 (event handlers), 这种ForceExecutionResult 属性和 event handlers 的互动是为了让ETL人员更灵活进行容错控制 ( fault tolerance).

Kicking it Down a Notch

有一点要记住, 事件冒泡会使得错误事件(Error event ) 连续的传送至执行栈. 在我们例子中.下一个冒泡级别的就是 Control Flow 即包本身 .

因为我们没有修改Precedence.dtsx 的 MaximumErrorCount 或 ForceExecutionResult 属性. 所以包执行到最后会提示失败.

我们有时希望有这样的特性,有时却不是.

我们面对一个设计方案: A) 在每个任务级别都添加容错,用来追踪错误   B) 打破默认的错误冒泡

让我们用B方案.

返回 Script Task 4  OnError event handler ,然后显示变量 :

图 7

注意别忘了显示系统变量:


图 8

System::Propagate 变量是一个布尔值,默认为True . 该变量用来控制事件冒泡:


图 9

把改制改为False:


图 10

执行 Precedence.dtsx SSIS包. 提示“Succeed Script Task 2,” 选 Yes;提示“Succeed Script Task 4,” 选 No. Script Task 4 的 OnError 事件执行如下:


图 11

接下来直接提示 Script Task3 完成了, 而Sequence Container 1的 OnError 事件没有执行:


图 12

可编程控制 Programmatic Control

我们也可以通过 Script Task来控制事件冒泡. 打开 Script Task 4 的  OnError 事件处理, 在ReadWriteVariables 属性里面把 System::Propagate 变量加进去:


图 13

把下面代码添加到如下图的位置:

图 14

If iErrorCode =  Then
Dts.Variables("Propagate").Value = False
Else
Dts.Variables("Propagate").Value = True
End If
Listing 1

…….后面有点罗嗦相信大家都能看懂上面代码什么意思.此处就不演示了,省略一千字……

我们也可以通过更改ErrorCode 的值来做测试.在Control Flow打开 Script Task 4 , 添加以下代码,如图:

VB 代码

Public Sub Main()

        Dim sTaskName As String = Dts.Variables("TaskName").Value.ToString
Dim iResponse As Integer iResponse = MsgBox("Succeed " & sTaskName & "?", _
MsgBoxStyle.YesNo + MsgBoxStyle.Question, _
sTaskName & " Success Question") If iResponse = vbYes Then
Dts.TaskResult = ScriptResults.Success
Else
'Dts.TaskResult = ScriptResults.Failure
Dts.Events.FireError(-, "Script Task 4", _
"Script Task 4 failed!", "", )
End If
End Sub
 
C# 代码
public void Main()
{
// TODO: Add your code here
string sTaskName = Dts.Variables["TaskName"].Value.ToString();
DialogResult iResponse = MessageBox.Show("Succeed" + sTaskName + "?", sTaskName, MessageBoxButtons.YesNo); if (iResponse == DialogResult.Yes) Dts.TaskResult = (int)ScriptResults.Success;
else
Dts.TaskResult = (int)ScriptResults.Failure;
Dts.Events.FireError(-, "Script Task 4", "Script Task 4 failed!", "", ); }

Listing 2

因为用其他错误代码来使得错误可以’冒泡’. (SSDT 2013 Bug 太多,弹窗弹的我吐血了 o(╯□╰)o)


图 20

图 21

冒泡++ Bubble++

事件冒泡可以夸包传递.做这个实验之前,我们先花一点时间介绍父子包设计(Parent-Child SSIS design pattern).

父子SSIS设计模式(The Parent-Child SSIS Design Pattern)

SSIS 的 Execute Package Task 用来调用其他SSIS 包.  当一个包调用另外一个包. 调用的这个表为父包( parent package ) . 被调用的则是子包 ( child package) . It turns out this description is more than merely semantics; it provides a good description of some interesting behavior and interaction between the packages.

让我们新增一个SSIS 包:


图 22

新建的为 Package1.dtsx. 然后重命名为Parent.dtsx as shown in Figure 23:

图 23

拖个 Execute Package Task 到 Control Flow 面板:


图 26

双击 Execute Package Task , Location 属性选择“File system” :


图 27

Connection 里选择 Precedence.dtsx

图 28

选中以后点OK 确认


图 31

为了让实验更直观点,我们把窗口排列下 . 左键点击“Precedence.dtsx”往右拖点,会出来提示,分割窗口

图 34

执行Parent.dtsx SSIS 包 它会调用 Precedence.dtsx .  提示“Succeed Script Task 2,” 的时候选k Yes; 提示“Succeed Script Task 4”的时候选 No. Script Task 4 和  Sequence Container 1 都会接到OnError 事件处理 .最后提示 Script Task 3 执行完毕. 结果如下图:

图 35

在 Precedence.dtsx中,注意 Script Task 4 执行失败,但是  Sequence Container 1 执行成功( ForceExecutionResult 属性设置为 “Success.”的关系) Error 事件冒泡至Sequence Container 1,如图:


图 36

还有一些事情发生,我们在Precedence.dtsx 上也加个 OnError 事件, 然后把 Sequence Container 1的 Script Task  拷贝过去 (我发现SSDT Bug太多了.直接拷贝会出现很多问题= = )

图 37

打开脚本编辑器,把 sSubComponent  替换掉.

Dim sSubComponent As String = _
"Precedence Package OnError Event Handler"

Listing 4

图 38

再次执行Precedence.dtsx 同样的选项我们会看到Precedence 的OnError 事件也触发了.


图 39

再把  Precedence的 OnError Script Task 拷贝到 Prent包的 OnError 事件处理:

图 40

同样的把 sSubComponent  这段代码替换掉

Dim sSubComponent As String = _
"Parent Package OnError Event Handler"

Listing 6

如图 90-91行:

图 41

再次运行,冒泡到 Parent了:

图 42

最后一件事 One Last Thing

本文中最后要讨论的是 DisableEventHandlers 属性. 看字面意思大家就知道…用来屏蔽EventHandlers:  点击Precedence.dtsx 然后点击Control Flow标签,在属性里面把DisableEventHandlers 改为True

图 45

点击 Parent.dtsx , . 按F5执行.提示“Succeed Script Task 2”的时候选择 Yes; 提示“Succeed Script Task 4,”选择 No. 接着下个提示框直接显示了Parent的 OnError 事件处理.  因为Precedence.dtsx 事件 event handlers 已经被屏蔽.

原文地址: http://www.sqlservercentral.com/articles/Integration+Services+(SSIS)/94876/

项目文件: My_First_SSIS_Project_Level_10.7z

[译]Stairway to Integration Services Level 10 - 高级事件活动的更多相关文章

  1. [译]Stairway to Integration Services Level 12 - 高级日志配置

    介绍 本文中,我们将结合之前学习的时间冒泡,日志记录,以及复制模型.建立一个自定义的SSIS包日志模型. SSIS Task事件回顾    Reviewing SSIS Task Events 在做实 ...

  2. [译]Stairway to Integration Services Level 16 – Flexible Source Locations (多文件导入)

    介绍 在本文中我们将利用SSIS参数,变量 以及 Foreach Loop Container 从多个源动态导入数据. 开始前我们先下载一些数据.WeatherData_Dec08_Apr09.zip ...

  3. [译]Stairway to Integration Services Level 9 - Control Flow Task Errors

    介绍 在本文中,我们会实验 MaximumErrorCount和ForceExecutioResult 故障容差属性,并且还要学习Control Flow task errors, event han ...

  4. [译]Stairway to Integration Services Level 8 - SSIS 工作流管理高级

    介绍 在前两个章节我们,建立了一个新的SSIS包,简单的使用了一下scripting还有优先约束,并且测试了MaxConcurrentExecutables 属性.  同时实验了  “On Succe ...

  5. [译]Stairway to Integration Services Level 18 – 部署和执行

    介绍 在本文中,我们要创建一个SSIS Catalog 实例,部署我们的项目,并且运行 weather data loader 包. SSIS 2012 部署模型   SSIS 2012 Deploy ...

  6. [译]Stairway to Integration Services Level 11 - 日志配置

    介绍 在前一个章节我们讨论了事先行为,分享了如何操作默认的行为和时间冒泡,并且介绍了父子模型. 本文中,我们会配置SSIS日志. 进行简单及高级日志配置,存储,和检索的实验.并且生成自定义日志信息. ...

  7. [译]Stairway to Integration Services Level 13 - SSIS 变量回顾

    介绍 在前一篇中我们组合了已经学过的事件冒泡 event bubbling, 日志记录 logging, 和父子模型 Parent-Child pattern 建立了自定义的SSIS包日志记录. 本文 ...

  8. [译]Stairway to Integration Services Level 7 - SSIS 工作流管理中级

    介绍 前一个章节我们对SSIS的优先约束做了初步了解,并且实验了MaxConcurrentExecutables 包属性的设置. 本文将测试“On Success”, “On Completion”, ...

  9. [译]Stairway to Integration Services Level 6 - SSIS 工作流管理基础

    简介 在之前的章节中,我们学习了增量载入数据. 本文中.我们通过优先约束(Precedence Constraints)来管理SSIS的工作流. 添加一个SSIS包 图 1 将新建的Package1. ...

随机推荐

  1. C语言负数的除法和求余运算

    假定我们让 a 除以 b,商为 q,余数为 r: q = a / b; r = a % b; 这里,不妨假定 b 大于 0. 我们希望 a.b.q.r 之间维持怎样的关系呢? 1.最重的一点,我们希望 ...

  2. RHEL6.4 NFS文件共享服务搭建

    NFS文件共享服务 1 实验方案 使用2台RHEL6.4虚拟机,其中一台作为NFS共享服务器(192.168.100.1).另外一台作为测试用的NFS客户机(192.168.100.2) 2.实现 2 ...

  3. cocos2dx tag和zorder

    当一个渲染对象加入到两外一个渲染对象中时,可以有两个可选参数,一个时tag,一个是order virtual void addChild(CCNode * child); virtual void a ...

  4. MFC 动态创建控件

    动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的.   一.创建动态控件:   为了对照,我们先来看一下静态控件的创建.   放置静态控件时必须先建立一个容器,一 ...

  5. 第八届acm省赛 A挑战密室(模拟)

    10406: A.挑战密室 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 29  Solved: 10 [Submit][Status][Web Bo ...

  6. 飘逸的python - 有的升序有的降序的情况下怎么多条件排序

    之前在统计导出各区服玩家消费的时候需要进行升序降序混搭的多条件排序. 需求是这样的.区服从小到大排,如果区服相同,则按消费从大到小排. 实现方法是利用python的sort算法是稳定排序,对数据进行多 ...

  7. POJ 1850 Code(找规律)

    Code Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 7913   Accepted: 3709 Description ...

  8. Asp.Net MVC4.0 官方教程 入门指南之五--控制器访问模型数据

    Asp.Net MVC4.0 官方教程 入门指南之五--控制器访问模型数据 在这一节中,你将新创建一个新的 MoviesController类,并编写代码,实现获取影片数据和使用视图模板在浏览器中展现 ...

  9. C++的常量折叠(二)

    前面的C++的常量折叠(一)的最后留下了一个问题,那就是在声明i的时候,加上修饰符volatile关键字,发现结果输出的就不一样了,下面来说一下volatile这个关键字. C/C++中的volati ...

  10. KMP算法番外篇--求解next数组

    KMP算法实现字符串的模式匹配的时间复杂度比朴素的模式匹配好很多,但是它时间效率的提高是有前提的,那就是:模式串的重复率很高,不然它的效率也不会凸显出来.在实际的应用中,KMP算法不算是使用率很高的一 ...