主頁 > 知識庫 > 基于SSIS 事件的向上傳遞(詳解)

基于SSIS 事件的向上傳遞(詳解)

熱門標(biāo)簽:優(yōu)質(zhì)地圖標(biāo)注 奧威地圖標(biāo)注多個地方 武漢長沙外呼系統(tǒng)方法和技巧 千呼電銷機(jī)器人價(jià)格 智能語音外呼系統(tǒng)選哪家 京華物流公司地圖標(biāo)注 怎樣在地圖上標(biāo)注路線圖標(biāo) 百度地圖標(biāo)注不同路線 外呼系統(tǒng)電銷專用

在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運(yùn)行(runtime)時(shí),SSIS引擎為了監(jiān)控和追蹤Task組件的運(yùn)行狀態(tài),預(yù)先創(chuàng)建了12個系統(tǒng)事件(Event),這些事件都是在Package運(yùn)行時(shí)(runtime)被可執(zhí)行程序(Executable)觸發(fā)的,每個事件都會產(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為每個事件都創(chuàng)建了默認(rèn)的事件處理程序,命名規(guī)范是:On+EventName,用戶可以創(chuàng)建自定義的事件處理程序,以擴(kuò)展Package的功能,使Package在運(yùn)行時(shí)更容易管理,以完成數(shù)據(jù)處理任務(wù)。在ETL開發(fā)中,最常用的事件是錯誤(Error)事件,該事件在Executable運(yùn)行出現(xiàn)錯誤時(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)行處理。有一個例外是在父子包結(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)處理。

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

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

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

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

錯誤事件處理程序把錯誤事件(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 窗體中,點(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,由于錯誤事件是被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,那么事件將不會向上傳遞,也不會被顯式處理,錯誤消息仍然會被SSISDB記錄,但強(qiáng)烈建議不要這樣做。

參考文檔:

Integration Services (SSIS) Event Handlers

System Variables

以上這篇基于SSIS 事件的向上傳遞(詳解)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

標(biāo)簽:銅仁 益陽 防疫戰(zhàn)設(shè) 威海 天水 宿州 來賓 七臺河

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《基于SSIS 事件的向上傳遞(詳解)》,本文關(guān)鍵詞  基于,SSIS,事件,的,向上,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《基于SSIS 事件的向上傳遞(詳解)》相關(guān)的同類信息!
  • 本頁收集關(guān)于基于SSIS 事件的向上傳遞(詳解)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章