• [译]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 包 :

    image

    图 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 :

    image
    图 2

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

    image
    图 3

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

    image
    图 4

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

    image

    图 5

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

    image

    图 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 ,然后显示变量 :

    image

    图 7

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

    image
    图 8

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

    image
    图 9

    把改制改为False:

    image
    图 10

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

    image
    图 11

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

    image
    图 12

    可编程控制 Programmatic Control

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

    image
    图 13

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

    image

    图 14

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

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

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

    image

    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(-1001, "Script Task 4", _
                                     "Script Task 4 failed!", "", 0)
            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(-1001, "Script Task 4", "Script Task 4 failed!", "", 0);
                
            }

    Listing 2

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

    image
    图 20

    image

    图 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 包:

    image
    图 22

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

    image

    图 23

    拖个 Execute Package Task 到 Control Flow 面板:

    image
    图 26

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

    image
    图 27

    Connection 里选择 Precedence.dtsx

    image

    图 28

    选中以后点OK 确认

    image
    图 31

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

    image

    图 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 执行完毕. 结果如下图:

    image

    图 35

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

    image
    图 36

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

    image

    图 37

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

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

    Listing 4

    image

    图 38

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

    image
    图 39

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

    image

    图 40

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

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

    Listing 6

    如图 90-91行:

    image

    图 41

    再次运行,冒泡到 Parent了:

    image


    图 42

    最后一件事 One Last Thing

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

    image

    图 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

  • 相关阅读:
    iftop 安装流程
    Centos 6.5 Tengine 安装流程
    linux 查看系统进程前十
    Centos 6.5 mongodb 安装流程
    linux 磁盘查看方式
    Linux 磁盘分区及挂载
    linux 路由添加
    rsyslog 重启
    文件上传到Web服务器
    一些链接1
  • 原文地址:https://www.cnblogs.com/haseo/p/4091788.html
Copyright © 2020-2023  润新知