基于SSIS 事件的向上傳遞(詳解)
在SSIS中,Package是Task組件的有序組合,具有層次結(jié)構(gòu),Package處于層次結(jié)構(gòu)的頂層(Root Level),對于父子包結(jié)構(gòu),父包(Parent Package)通過Execute Package Task組件調(diào)用其他Package,被調(diào)用的Package是子包,父包是子包的上層級別,最頂層的Package,處于層次結(jié)構(gòu)的頂層,叫做根包(Root Package);容器(Container)組件包含其他Task組件,容器是被包含的Task組件的父級別(Parent Level);Task組件是層次結(jié)構(gòu)的最底層,處于葉級別(Leaf Level)。事件就是沿著Package的層次結(jié)構(gòu)向上傳遞的。
在Package中,每一個(gè)Task組件都是一個(gè)可執(zhí)行程序(Executable),所有的數(shù)據(jù)處理任務(wù)都是由Task組件完成的。在Package運(yùn)行(runtime)時(shí),SSIS引擎為了監(jiān)控和追蹤Task組件的運(yùn)行狀態(tài),預(yù)先創(chuàng)建了12個(gè)系統(tǒng)事件(Event),這些事件都是在Package運(yùn)行時(shí)(runtime)被可執(zhí)行程序(Executable)觸發(fā)的,每個(gè)事件都會產(chǎn)生相應(yīng)的消息,用于描述Executable的運(yùn)行狀態(tài),供開發(fā)工程師對Package進(jìn)行調(diào)試和性能調(diào)優(yōu)。一旦有事件被觸發(fā),SSIS會執(zhí)行相應(yīng)的事件處理程序(Event Handler),SSIS為每個(gè)事件都創(chuàng)建了默認(rèn)的事件處理程序,命名規(guī)范是:On+EventName,用戶可以創(chuàng)建自定義的事件處理程序,以擴(kuò)展Package的功能,使Package在運(yùn)行時(shí)更容易管理,以完成數(shù)據(jù)處理任務(wù)。在ETL開發(fā)中,最常用的事件是錯(cuò)誤(Error)事件,該事件在Executable運(yùn)行出現(xiàn)錯(cuò)誤時(shí)觸發(fā),對應(yīng)的事件處理程序是OnError。
在Package的層次結(jié)構(gòu)中,事件處理具有向上傳遞(Propagate)的特性。發(fā)生在Task組件的事件,首先會被該Task組件的Event Handler捕獲和處理;如果該Task組件沒有創(chuàng)建Event Handler,那么SSIS把該Event向上傳遞到其父級別的Executable,由其父級別的Event Handler來處理;如果該Executable有Event Handler,那么由該Event Handler負(fù)責(zé)響應(yīng)和處理該事件。事件會依次向上傳遞,直到事件被處理,或者傳遞到頂層被默認(rèn)處理,事件向上傳遞的頂層是根包(Root Package)。
引用MSDN官方文檔的例子,Package的層次結(jié)構(gòu)如下圖所示:
在層次結(jié)構(gòu)中,如果相應(yīng)的Task組件沒有定義事件處理程序,那么事件向上傳遞的過程如下圖所示:
注:事件向上傳遞的條件是沒有創(chuàng)建自定義的事件處理程序,默認(rèn)情況下,該圖示有誤,事件被Event Handler處理之后,將繼續(xù)向上傳遞,我會在下文詳細(xì)解釋。
MSDN對圖示做了說明:
If an event has no event handler, the event is raised to the next container up the container hierarchy in a package. If this container has an event handler, the event handler runs in response to the event. If not, the event is raised to the next container up the container hierarchy. Only the package has an event handler, for its OnError event. If an error occurs when the Execute SQL task runs, the OnError event handler for the package runs.
把事件依次向上傳遞的特性,是由事件處理程序(Event Handler)的系統(tǒng)變量 Propagate 控制的,變量Propagate的默認(rèn)值是True,這意味著,默認(rèn)情況下,該事件將會被傳遞到上層級別的Event Handler中進(jìn)行處理。有一個(gè)例外是在父子包結(jié)構(gòu)中,子Package在進(jìn)行包驗(yàn)證(Validation)時(shí),不管子包的Propagate變量的值如何設(shè)置,都會把驗(yàn)證事件傳遞到父包中,父包繼續(xù)執(zhí)行驗(yàn)證。
當(dāng)前Task組件必須創(chuàng)建事件處理程序,才能查看和修改變量Propagate的值。如果把事件處理程序(Event Handler)的Propagate變量設(shè)置為False,那么該事件只會被當(dāng)前的事件處理程序處理和響應(yīng),不會被傳遞到上層級別的事件處理程序中。但是,如果沒有為“肇事”的Task組件創(chuàng)建事件處理程序(Event Handler),那么事件總是向上傳遞,直到被事件處理程序響應(yīng),如果Package的層次結(jié)構(gòu)沒有定義任何事件處理程序,那么事件最終被根包(Root Package)默認(rèn)處理。
一,錯(cuò)誤事件處理程序(OnError)向上傳遞
默認(rèn)情況下,當(dāng)前Task組件的事件處理程序中把錯(cuò)誤(Error)事件處理之后,SSIS引擎仍然把錯(cuò)誤事件向上層事件處理程序傳遞,直到包層次結(jié)構(gòu)的最頂層,如下圖,在ChildPackage的Package級別和Executable級別上分別創(chuàng)建了OnError事件處理程序,Executable級別是child Execute SQL Task:
執(zhí)行Package,在child Execute SQL Task中觸發(fā)錯(cuò)誤事件,被該Task的事件處理程序捕獲和處理,下圖是Executable級別的OnError事件處理程序,其成功執(zhí)行一個(gè)Task:
但是,錯(cuò)誤事件沒有停止,而是繼續(xù)向上傳遞,被其直接上級,也就是Package級別的OnError事件處理程序捕獲,如下圖,來自子Task組件的錯(cuò)誤事件被父級處理之后,Package仍然報(bào)錯(cuò),錯(cuò)誤消息是:Package execution completed with error.
錯(cuò)誤事件處理程序把錯(cuò)誤事件(Error)向上傳遞(Propagate)的過程類似“冒泡”,從觸發(fā)錯(cuò)誤事件的“肇事”Task組件開始,逐級向上傳遞到最頂層的可執(zhí)行程序(Executable),最頂層的Executable是 Package 本身。這意味著,如果在Package 級別定義了一個(gè)錯(cuò)誤事件處理程序(OnError),每當(dāng)Package中的任意一個(gè)Task組件觸發(fā)錯(cuò)誤事件(Error),最終都會觸發(fā)Package級別的錯(cuò)誤事件處理程序。在父子包結(jié)構(gòu)中,如果父Package通過Execute Package Task調(diào)用子Package,那么,錯(cuò)誤事件會發(fā)生相同的過程,子Package的錯(cuò)誤事件會向上傳遞(Propagate)到父Package中。
二,禁用錯(cuò)誤事件的向上傳遞
如果想要禁用事件的向上傳遞過程,可以在Task組件的事件處理程序中,把系統(tǒng)變量Propagate設(shè)置為False,這樣,事件將不再向上傳遞,只觸發(fā)當(dāng)前Task組件的事件處理程序,只有在Task組件中創(chuàng)建事件處理程序之后,才能修改系統(tǒng)變量Propagate的默認(rèn)值。
1,修改系統(tǒng)變量Propagate的默認(rèn)值
step1,呈現(xiàn)系統(tǒng)變量
打開Event Handlers Tab,在Variables 窗體中,點(diǎn)擊網(wǎng)格選項(xiàng)(Grid Options)按鈕,打開Variable Grid Options 窗體,在Filter選項(xiàng)中勾選"Show system variables",點(diǎn)擊“OK”,返回到Variables窗體:
step2,設(shè)置Propagate的值
在 Variables 窗體中,找到 Propagate 系統(tǒng)變量(Scope是OnError),把Value設(shè)置為False
2,禁用事件處理的向上傳遞
禁用Task組件的事件處理的向上傳遞(Propagate)特性之后,在當(dāng)前Task組件中觸發(fā)的事件,只會被當(dāng)前Task組件的事件處理程序捕獲和處理,而不傳遞到上層Task組件的事件處理程序。
再次執(zhí)行Package,由于錯(cuò)誤事件是被child Execute SQL Task觸發(fā)的,其事件處理程序自動捕獲并處理該Error事件:
而Package級別的事件處理程序沒有捕獲到Error事件,Package沒有執(zhí)行OnError事件處理程序,最終的執(zhí)行結(jié)果是:Package execution completed with success。
三,沒有創(chuàng)建事件處理程序
如果沒有為Task組件創(chuàng)建事件處理程序(Event Handler),那么事件總是從當(dāng)前Task組件向上傳遞。用戶創(chuàng)建事件處理程序,并不意味著,需要在其中添加Task組件,做數(shù)據(jù)處理任務(wù),空的事件處理程序是允許的。在空的事件處理程序中把系統(tǒng)變量Propagate設(shè)置為False,那么事件將不會向上傳遞,也不會被顯式處理,錯(cuò)誤消息仍然會被SSISDB記錄,但強(qiáng)烈建議不要這樣做。
參考文檔:
Integration Services (SSIS) Event Handlers
System Variables
以上這篇基于SSIS 事件的向上傳遞(詳解)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持我們。
上一篇:安裝SQL Server 2016出錯(cuò)提示:需要安裝oracle JRE7 更新 51(64位)或更高版本問題的解決方法
欄 目:MsSql
本文標(biāo)題:基于SSIS 事件的向上傳遞(詳解)
本文地址:http://mengdiqiu.com.cn/a1/MsSql/10394.html


閱讀排行
本欄相關(guān)
- 01-10SQLServer存儲過程實(shí)現(xiàn)單條件分頁
- 01-10SQLServer中防止并發(fā)插入重復(fù)數(shù)據(jù)的方
- 01-10SQL Server 2012降級至2008R2的方法
- 01-10SQL Server性能調(diào)優(yōu)之緩存
- 01-10SQL Server數(shù)據(jù)庫定時(shí)自動備份
- 01-10Sql Server 死鎖的監(jiān)控分析解決思路
- 01-10實(shí)現(xiàn)SQL Server 原生數(shù)據(jù)從XML生成JSON數(shù)
- 01-10SqlServer快速檢索某個(gè)字段在哪些存儲
- 01-10SqlServer 在事務(wù)中獲得自增ID的實(shí)例代
- 01-10SQLServer性能優(yōu)化--間接實(shí)現(xiàn)函數(shù)索引或
隨機(jī)閱讀
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10delphi制作wav文件的方法
- 04-02jquery與jsp,用jquery
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置