介绍

在前一篇文章中我们介绍了故障容差相关的 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 = 8 ThenDts.Variables("Propagate").Value = FalseElseDts.Variables("Propagate").Value = TrueEnd If

Listing 1

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

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

VB 代码

Public Sub Main()Dim sTaskName As String = Dts.Variables("TaskName").Value.ToStringDim iResponse As IntegeriResponse = MsgBox("Succeed " & sTaskName & "?", _MsgBoxStyle.YesNo + MsgBoxStyle.Question, _sTaskName & " Success Question")If iResponse = vbYes ThenDts.TaskResult = ScriptResults.SuccessElse'Dts.TaskResult = ScriptResults.FailureDts.Events.FireError(-1001, "Script Task 4", _"Script Task 4 failed!", "", 0)End IfEnd Sub

 
C# 代码
public void Main(){// TODO: Add your code herestring sTaskName = Dts.Variables["TaskName"].Value.ToString();DialogResult iResponse = MessageBox.Show("Succeed" + sTaskName + "?", sTaskName, MessageBoxButtons.YesNo);if (iResponse == DialogResult.Yes)Dts.TaskResult = (int)ScriptResults.Success;elseDts.TaskResult = (int)ScriptResults.Failure;Dts.Events.FireError(-1001, "Script Task 4", "Script Task 4 failed!", "", 0);}

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

转载于:https://www.cnblogs.com/haseo/p/4091788.html

[译]Stairway to Integration Services Level 10 - 高级事件活动相关推荐

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

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

  2. 【译】第十篇 Integration Services:高级事件行为

    本篇文章是Integration Services系列的第十篇,详细内容请参考原文. 简介 在前一篇, we introduced fault tolerance by examining metho ...

  3. SQL Server Integration Services(SSIS)中的脚本任务调试

    脚本任务 ( Script Task ) In SQL Server Integration services (SSIS), it may not be possible to meet all t ...

  4. 单包攻击_SQL Server Integration Services 2016中的单包部署

    单包攻击 SQL Server 2016 has some exciting enhancements to SQL Server Integration Services. In this arti ...

  5. Spring Integration 4.3.10 发布,Spring 消息通信

    Spring Integration 4.3.10 发布了.Spring Integration 能在基于 Spring 的应用中进行简单的消息通信,并通过简单的适配器与外部系统集成.这些适配器提供了 ...

  6. SQL Server 2005 Integration Services (SSIS) (2) - 导入/导出向导

    下面通过一个例子,利用最新的SQL Server 2005 Export/Import 向导来建立一个简单的SSIS Package (包),这个SSIS将把SQL Server 2005 自带的Ad ...

  7. ETL学习之四:SQL Server Integration Services入门

    ETL学习之四:SQL Server Integration Services入门 SSIS就是微软在SQL SERVER2005上对DTS的升级,不得不说,微软在BI上是花了很大功夫的,包括提供了S ...

  8. 使用和执行SQL Server Integration Services包的方法

    SQL 小号 QL Server 小号 erver Integration 我 ntegration Services) are a part of the Microsoft SQL Server ...

  9. ETL学习之五:创建新的 Integration Services 项目

    在 Microsoft SQL Server 2005 Integration Services (SSIS) 中创建包的第一步就是创建一个 Integration Services 项目.此项目包含 ...

最新文章

  1. Docker(八):Docker Compose
  2. 关于大型网站技术演进的思考(七)--存储的瓶颈(7)
  3. mysql远程权限grant_mysql 赋给用户远程权限 grant all privileges on
  4. Elasticsearch 教程--入门
  5. exchange系列(四)如何保护exchange邮件服务器的安全
  6. 音视频技术开发周刊 | 146
  7. 【Linux开发】linux设备驱动归纳总结(二):模块的相关基础概念
  8. html课做一个网页,菜鸟自学建站 HTML 第三课 制作我的第一个网页_html/css_WEB-ITnose...
  9. Springboot配置fastjson开发
  10. python3的字符串操作
  11. Unity3D游戏资源的提取
  12. 随机信号分析 matlab仿真实验,随机信号分析实验报告的(基于MATLAB语言).docx
  13. 计算机一级常用计算公式,2012年计算机一级B考点详解(4)
  14. mobileconfig使用发布者证书动态签名
  15. TruckSim 建立牵引车模型(一)
  16. 计算机桌面调音量的图标不见了,声音图标不见了,音量图标不见了怎么办?
  17. python 如何将视频文件的语音转换为文字
  18. BC20 MQTT与GPS功能测试
  19. 深度学习-扩张卷积(dilated convolution)
  20. n平方的求和公式_n的二次方怎么求和?

热门文章

  1. Mac OS X:如何制作一个可启动HFS+,一个FAT32,和一个NTFS分区(外置硬盘)
  2. 我国70个大中城市住宅房地产市场行情统计分析
  3. 卡巴斯基7.0豪華版
  4. Windows10上红警等游戏不能全屏问题
  5. ORACLE EBS的系统集成性
  6. python点云可视化_3D可视化神器之Open3D
  7. 漂亮的CSS蓝色滑动门式的导航菜单
  8. 帐号泄露事件频发,到底什么样的密码才安全?
  9. AcWing 1738. 蹄球
  10. 快速软件开发——软件开发基本原则