在SSIS中,Package是Task組件的有序組合,具有層次結(jié)構(gòu),Package處于層次結(jié)構(gòu)的頂層(Root Level),對(duì)于父子包結(jié)構(gòu),父包(Parent Package)通過(guò)Execute Package Task組件調(diào)用其他Package,被調(diào)用的Package是子包,父包是子包的上層級(jí)別,最頂層的Package,處于層次結(jié)構(gòu)的頂層,叫做根包(Root Package);容器(Container)組件包含其他Task組件,容器是被包含的Task組件的父級(jí)別(Parent Level);Task組件是層次結(jié)構(gòu)的最底層,處于葉級(jí)別(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è)事件都會(huì)產(chǎn)生相應(yīng)的消息,用于描述Executable的運(yùn)行狀態(tài),供開(kāi)發(fā)工程師對(duì)Package進(jìn)行調(diào)試和性能調(diào)優(yōu)。一旦有事件被觸發(fā),SSIS會(huì)執(zhí)行相應(yīng)的事件處理程序(Event Handler),SSIS為每個(gè)事件都創(chuàng)建了默認(rèn)的事件處理程序,命名規(guī)范是:On+EventName,用戶(hù)可以創(chuàng)建自定義的事件處理程序,以擴(kuò)展Package的功能,使Package在運(yùn)行時(shí)更容易管理,以完成數(shù)據(jù)處理任務(wù)。在ETL開(kāi)發(fā)中,最常用的事件是錯(cuò)誤(Error)事件,該事件在Executable運(yùn)行出現(xiàn)錯(cuò)誤時(shí)觸發(fā),對(duì)應(yīng)的事件處理程序是OnError。

在Package的層次結(jié)構(gòu)中,事件處理具有向上傳遞(Propagate)的特性。發(fā)生在Task組件的事件,首先會(huì)被該Task組件的Event Handler捕獲和處理;如果該Task組件沒(méi)有創(chuàng)建Event Handler,那么SSIS把該Event向上傳遞到其父級(jí)別的Executable,由其父級(jí)別的Event Handler來(lái)處理;如果該Executable有Event Handler,那么由該Event Handler負(fù)責(zé)響應(yīng)和處理該事件。事件會(huì)依次向上傳遞,直到事件被處理,或者傳遞到頂層被默認(rèn)處理,事件向上傳遞的頂層是根包(Root Package)。

引用MSDN官方文檔的例子,Package的層次結(jié)構(gòu)如下圖所示:

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開(kāi)發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

在層次結(jié)構(gòu)中,如果相應(yīng)的Task組件沒(méi)有定義事件處理程序,那么事件向上傳遞的過(guò)程如下圖所示:

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開(kāi)發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

注:事件向上傳遞的條件是沒(méi)有創(chuàng)建自定義的事件處理程序,默認(rèn)情況下,該圖示有誤,事件被Event Handler處理之后,將繼續(xù)向上傳遞,我會(huì)在下文詳細(xì)解釋。

MSDN對(duì)圖示做了說(shuō)明:

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)情況下,該事件將會(huì)被傳遞到上層級(jí)別的Event Handler中進(jìn)行處理。有一個(gè)例外是在父子包結(jié)構(gòu)中,子Package在進(jìn)行包驗(yàn)證(Validation)時(shí),不管子包的Propagate變量的值如何設(shè)置,都會(huì)把驗(yàn)證事件傳遞到父包中,父包繼續(xù)執(zhí)行驗(yàn)證。

當(dāng)前Task組件必須創(chuàng)建事件處理程序,才能查看和修改變量Propagate的值。如果把事件處理程序(Event Handler)的Propagate變量設(shè)置為False,那么該事件只會(huì)被當(dāng)前的事件處理程序處理和響應(yīng),不會(huì)被傳遞到上層級(jí)別的事件處理程序中。但是,如果沒(méi)有為“肇事”的Task組件創(chuàng)建事件處理程序(Event Handler),那么事件總是向上傳遞,直到被事件處理程序響應(yīng),如果Package的層次結(jié)構(gòu)沒(méi)有定義任何事件處理程序,那么事件最終被根包(Root Package)默認(rèn)處理。

一,錯(cuò)誤事件處理程序(OnError)向上傳遞

默認(rèn)情況下,當(dāng)前Task組件的事件處理程序中把錯(cuò)誤(Error)事件處理之后,SSIS引擎仍然把錯(cuò)誤事件向上層事件處理程序傳遞,直到包層次結(jié)構(gòu)的最頂層,如下圖,在ChildPackage的Package級(jí)別和Executable級(jí)別上分別創(chuàng)建了OnError事件處理程序,Executable級(jí)別是child Execute SQL Task:

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開(kāi)發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

執(zhí)行Package,在child Execute SQL Task中觸發(fā)錯(cuò)誤事件,被該Task的事件處理程序捕獲和處理,下圖是Executable級(jí)別的OnError事件處理程序,其成功執(zhí)行一個(gè)Task:

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開(kāi)發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

但是,錯(cuò)誤事件沒(méi)有停止,而是繼續(xù)向上傳遞,被其直接上級(jí),也就是Package級(jí)別的OnError事件處理程序捕獲,如下圖,來(lái)自子Task組件的錯(cuò)誤事件被父級(jí)處理之后,Package仍然報(bào)錯(cuò),錯(cuò)誤消息是:Package execution completed with error.

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開(kāi)發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開(kāi)發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

錯(cuò)誤事件處理程序把錯(cuò)誤事件(Error)向上傳遞(Propagate)的過(guò)程類(lèi)似“冒泡”,從觸發(fā)錯(cuò)誤事件的“肇事”Task組件開(kāi)始,逐級(jí)向上傳遞到最頂層的可執(zhí)行程序(Executable),最頂層的Executable是 Package 本身。這意味著,如果在Package 級(jí)別定義了一個(gè)錯(cuò)誤事件處理程序(OnError),每當(dāng)Package中的任意一個(gè)Task組件觸發(fā)錯(cuò)誤事件(Error),最終都會(huì)觸發(fā)Package級(jí)別的錯(cuò)誤事件處理程序。在父子包結(jié)構(gòu)中,如果父Package通過(guò)Execute Package Task調(diào)用子Package,那么,錯(cuò)誤事件會(huì)發(fā)生相同的過(guò)程,子Package的錯(cuò)誤事件會(huì)向上傳遞(Propagate)到父Package中。

二,禁用錯(cuò)誤事件的向上傳遞

如果想要禁用事件的向上傳遞過(guò)程,可以在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)變量

打開(kāi)Event Handlers Tab,在Variables 窗體中,點(diǎn)擊網(wǎng)格選項(xiàng)(Grid Options)按鈕,打開(kāi)Variable Grid Options 窗體,在Filter選項(xiàng)中勾選"Show system variables",點(diǎn)擊“OK”,返回到Variables窗體:

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開(kāi)發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開(kāi)發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

step2,設(shè)置Propagate的值

在 Variables 窗體中,找到 Propagate 系統(tǒng)變量(Scope是OnError),把Value設(shè)置為False

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開(kāi)發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

2,禁用事件處理的向上傳遞

禁用Task組件的事件處理的向上傳遞(Propagate)特性之后,在當(dāng)前Task組件中觸發(fā)的事件,只會(huì)被當(dāng)前Task組件的事件處理程序捕獲和處理,而不傳遞到上層Task組件的事件處理程序。

再次執(zhí)行Package,由于錯(cuò)誤事件是被child Execute SQL Task觸發(fā)的,其事件處理程序自動(dòng)捕獲并處理該Error事件:

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開(kāi)發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

而Package級(jí)別的事件處理程序沒(méi)有捕獲到Error事件,Package沒(méi)有執(zhí)行OnError事件處理程序,最終的執(zhí)行結(jié)果是:Package execution completed with success。

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開(kāi)發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開(kāi)發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

三,沒(méi)有創(chuàng)建事件處理程序

如果沒(méi)有為T(mén)ask組件創(chuàng)建事件處理程序(Event Handler),那么事件總是從當(dāng)前Task組件向上傳遞。用戶(hù)創(chuàng)建事件處理程序,并不意味著,需要在其中添加Task組件,做數(shù)據(jù)處理任務(wù),空的事件處理程序是允許的。在空的事件處理程序中把系統(tǒng)變量Propagate設(shè)置為False,那么事件將不會(huì)向上傳遞,也不會(huì)被顯式處理,錯(cuò)誤消息仍然會(huì)被SSISDB記錄,但強(qiáng)烈建議不要這樣做。

http://www.cnblogs.com/ljhdo/p/5125140.html