溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

基于SSIS事件向上傳遞的示例分析

發(fā)布時間:2021-07-29 14:13:10 來源:億速云 閱讀:134 作者:小新 欄目:數(shù)據(jù)庫

這篇文章主要介紹了基于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中,每一個Task組件都是一個可執(zhí)行程序(Executable),所有的數(shù)據(jù)處理任務(wù)都是由Task組件完成的。在Package運行(runtime)時,SSIS引擎為了監(jiān)控和追蹤Task組件的運行狀態(tài),預(yù)先創(chuàng)建了12個系統(tǒng)事件(Event),這些事件都是在Package運行時(runtime)被可執(zhí)行程序(Executable)觸發(fā)的,每個事件都會產(chǎn)生相應(yīng)的消息,用于描述Executable的運行狀態(tài),供開發(fā)工程師對Package進(jìn)行調(diào)試和性能調(diào)優(yōu)。一旦有事件被觸發(fā),SSIS會執(zhí)行相應(yīng)的事件處理程序(Event Handler),SSIS為每個事件都創(chuàng)建了默認(rèn)的事件處理程序,命名規(guī)范是:On+EventName,用戶可以創(chuàng)建自定義的事件處理程序,以擴展Package的功能,使Package在運行時更容易管理,以完成數(shù)據(jù)處理任務(wù)。在ETL開發(fā)中,最常用的事件是錯誤(Error)事件,該事件在Executable運行出現(xiàn)錯誤時觸發(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)如下圖所示:

基于SSIS事件向上傳遞的示例分析

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

基于SSIS事件向上傳遞的示例分析

注:事件向上傳遞的條件是沒有創(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)行處理。有一個例外是在父子包結(jié)構(gòu)中,子Package在進(jìn)行包驗證(Validation)時,不管子包的Propagate變量的值如何設(shè)置,都會把驗證事件傳遞到父包中,父包繼續(xù)執(zhí)行驗證。

當(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)處理。

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

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

基于SSIS事件向上傳遞的示例分析

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

基于SSIS事件向上傳遞的示例分析

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

基于SSIS事件向上傳遞的示例分析

基于SSIS事件向上傳遞的示例分析

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

二,禁用錯誤事件的向上傳遞

如果想要禁用事件的向上傳遞過程,可以在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 窗體中,點擊網(wǎng)格選項(Grid Options)按鈕,打開Variable Grid Options 窗體,在Filter選項中勾選"Show system variables",點擊“OK”,返回到Variables窗體:

基于SSIS事件向上傳遞的示例分析

基于SSIS事件向上傳遞的示例分析

step2,設(shè)置Propagate的值

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

基于SSIS事件向上傳遞的示例分析

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

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

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

基于SSIS事件向上傳遞的示例分析

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

基于SSIS事件向上傳遞的示例分析

基于SSIS事件向上傳遞的示例分析

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

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

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“基于SSIS事件向上傳遞的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI