久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

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

161次閱讀
沒有評論

共計 3883 個字符,預計需要花費 10 分鐘才能閱讀完成。

這篇文章主要介紹了基于 SSIS 事件向上傳遞的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓丸趣 TV 小編帶著大家一起了解一下。

在 SSIS 中,Package 是 Task 組件的有序組合,具有層次結構,Package 處于層次結構的頂層(Root Level),對于父子包結構,父包(Parent Package)通過 Execute Package Task 組件調用其他 Package,被調用的 Package 是子包,父包是子包的上層級別,最頂層的 Package,處于層次結構的頂層,叫做根包(Root Package);容器(Container)組件包含其他 Task 組件,容器是被包含的 Task 組件的父級別(Parent Level);Task 組件是層次結構的最底層,處于葉級別(Leaf Level)。事件就是沿著 Package 的層次結構向上傳遞的。

在 Package 中,每一個 Task 組件都是一個可執行程序(Executable),所有的數據處理任務都是由 Task 組件完成的。在 Package 運行(runtime)時,SSIS 引擎為了監控和追蹤 Task 組件的運行狀態,預先創建了 12 個系統事件(Event),這些事件都是在 Package 運行時(runtime)被可執行程序(Executable)觸發的,每個事件都會產生相應的消息,用于描述 Executable 的運行狀態,供開發工程師對 Package 進行調試和性能調優。一旦有事件被觸發,SSIS 會執行相應的事件處理程序(Event Handler),SSIS 為每個事件都創建了默認的事件處理程序,命名規范是:On+EventName,用戶可以創建自定義的事件處理程序,以擴展 Package 的功能,使 Package 在運行時更容易管理,以完成數據處理任務。在 ETL 開發中,最常用的事件是錯誤(Error)事件,該事件在 Executable 運行出現錯誤時觸發,對應的事件處理程序是 OnError。

在 Package 的層次結構中,事件處理具有向上傳遞(Propagate)的特性。發生在 Task 組件的事件,首先會被該 Task 組件的 Event Handler 捕獲和處理;如果該 Task 組件沒有創建 Event Handler,那么 SSIS 把該 Event 向上傳遞到其父級別的 Executable,由其父級別的 Event Handler 來處理;如果該 Executable 有 Event Handler,那么由該 Event Handler 負責響應和處理該事件。事件會依次向上傳遞,直到事件被處理,或者傳遞到頂層被默認處理,事件向上傳遞的頂層是根包(Root Package)。

引用 MSDN 官方文檔的例子,Package 的層次結構如下圖所示:

在層次結構中,如果相應的 Task 組件沒有定義事件處理程序,那么事件向上傳遞的過程如下圖所示:

注:事件向上傳遞的條件是沒有創建自定義的事件處理程序,默認情況下,該圖示有誤,事件被 Event Handler 處理之后,將繼續向上傳遞,我會在下文詳細解釋。

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)的系統變量 Propagate 控制的,變量 Propagate 的默認值是 True,這意味著,默認情況下,該事件將會被傳遞到上層級別的 Event Handler 中進行處理。有一個例外是在父子包結構中,子 Package 在進行包驗證(Validation)時,不管子包的 Propagate 變量的值如何設置,都會把驗證事件傳遞到父包中,父包繼續執行驗證。

當前 Task 組件必須創建事件處理程序,才能查看和修改變量 Propagate 的值。如果把事件處理程序(Event Handler)的 Propagate 變量設置為 False,那么該事件只會被當前的事件處理程序處理和響應,不會被傳遞到上層級別的事件處理程序中。但是,如果沒有為“肇事”的 Task 組件創建事件處理程序(Event Handler),那么事件總是向上傳遞,直到被事件處理程序響應,如果 Package 的層次結構沒有定義任何事件處理程序,那么事件最終被根包(Root Package)默認處理。

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

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

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

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

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

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

如果想要禁用事件的向上傳遞過程,可以在 Task 組件的事件處理程序中,把系統變量 Propagate 設置為 False,這樣,事件將不再向上傳遞,只觸發當前 Task 組件的事件處理程序,只有在 Task 組件中創建事件處理程序之后,才能修改系統變量 Propagate 的默認值。

1,修改系統變量 Propagate 的默認值

step1,呈現系統變量

打開 Event Handlers Tab,在 Variables 窗體中,點擊網格選項(Grid Options)按鈕,打開 Variable Grid Options 窗體,在 Filter 選項中勾選 Show system variables,點擊“OK”,返回到 Variables 窗體:

step2,設置 Propagate 的值

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

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

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

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

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

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

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

三,沒有創建事件處理程序

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

感謝你能夠認真閱讀完這篇文章,希望丸趣 TV 小編分享的“基于 SSIS 事件向上傳遞的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持丸趣 TV,關注丸趣 TV 行業資訊頻道,更多相關知識等著你來學習!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-04發表,共計3883字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 河西区| 方正县| 墨江| 西宁市| 太谷县| 将乐县| 沾益县| 秦安县| 贵德县| 合作市| 南宫市| 新丰县| 马尔康县| 阳山县| 嘉兴市| SHOW| 郯城县| 偏关县| 龙里县| 池州市| 兰州市| 文成县| 通城县| 永嘉县| 延津县| 凤冈县| 兴城市| 淅川县| 绥德县| 游戏| 织金县| 施甸县| 衡东县| 东海县| 沭阳县| 海门市| 安龙县| 绥棱县| 贵州省| 永年县| 兖州市|