[译]Stairway to Integration Services Level 10 - 高级事件活动
介绍
在前一篇文章中我们介绍了故障容差相关的 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 - 高级事件活动相关推荐
- [译]Stairway to Integration Services Level 13 - SSIS 变量回顾
介绍 在前一篇中我们组合了已经学过的事件冒泡 event bubbling, 日志记录 logging, 和父子模型 Parent-Child pattern 建立了自定义的SSIS包日志记录. 本文 ...
- 【译】第十篇 Integration Services:高级事件行为
本篇文章是Integration Services系列的第十篇,详细内容请参考原文. 简介 在前一篇, we introduced fault tolerance by examining metho ...
- SQL Server Integration Services(SSIS)中的脚本任务调试
脚本任务 ( Script Task ) In SQL Server Integration services (SSIS), it may not be possible to meet all t ...
- 单包攻击_SQL Server Integration Services 2016中的单包部署
单包攻击 SQL Server 2016 has some exciting enhancements to SQL Server Integration Services. In this arti ...
- Spring Integration 4.3.10 发布,Spring 消息通信
Spring Integration 4.3.10 发布了.Spring Integration 能在基于 Spring 的应用中进行简单的消息通信,并通过简单的适配器与外部系统集成.这些适配器提供了 ...
- SQL Server 2005 Integration Services (SSIS) (2) - 导入/导出向导
下面通过一个例子,利用最新的SQL Server 2005 Export/Import 向导来建立一个简单的SSIS Package (包),这个SSIS将把SQL Server 2005 自带的Ad ...
- ETL学习之四:SQL Server Integration Services入门
ETL学习之四:SQL Server Integration Services入门 SSIS就是微软在SQL SERVER2005上对DTS的升级,不得不说,微软在BI上是花了很大功夫的,包括提供了S ...
- 使用和执行SQL Server Integration Services包的方法
SQL 小号 QL Server 小号 erver Integration 我 ntegration Services) are a part of the Microsoft SQL Server ...
- ETL学习之五:创建新的 Integration Services 项目
在 Microsoft SQL Server 2005 Integration Services (SSIS) 中创建包的第一步就是创建一个 Integration Services 项目.此项目包含 ...
最新文章
- Docker(八):Docker Compose
- 关于大型网站技术演进的思考(七)--存储的瓶颈(7)
- mysql远程权限grant_mysql 赋给用户远程权限 grant all privileges on
- Elasticsearch 教程--入门
- exchange系列(四)如何保护exchange邮件服务器的安全
- 音视频技术开发周刊 | 146
- 【Linux开发】linux设备驱动归纳总结(二):模块的相关基础概念
- html课做一个网页,菜鸟自学建站 HTML 第三课 制作我的第一个网页_html/css_WEB-ITnose...
- Springboot配置fastjson开发
- python3的字符串操作
- Unity3D游戏资源的提取
- 随机信号分析 matlab仿真实验,随机信号分析实验报告的(基于MATLAB语言).docx
- 计算机一级常用计算公式,2012年计算机一级B考点详解(4)
- mobileconfig使用发布者证书动态签名
- TruckSim 建立牵引车模型(一)
- 计算机桌面调音量的图标不见了,声音图标不见了,音量图标不见了怎么办?
- python 如何将视频文件的语音转换为文字
- BC20 MQTT与GPS功能测试
- 深度学习-扩张卷积(dilated convolution)
- n平方的求和公式_n的二次方怎么求和?