在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,用戶可以創(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)如下圖所示:
在層次結(jié)構(gòu)中,如果相應(yīng)