SQL資料庫開發中的SSIS 延遲驗證方法

悅光陰發表於2019-01-30

驗證是一個事件,該事件在Package執行時,第一個被觸發,驗證能夠避免SSIS引擎執行一個有異常的Package或Task。延遲驗證(DelayValidation)是把驗證操作延遲到Package真正執行(run-time)時開始執行,當禁用延遲驗證時,一旦驗證操作返回錯誤(Error)或警告(Warning),Package就不會繼續執行下去。在更新海量的資料時,通常需要用到暫存表把遠端資料載入到本地,這就需要在Package執行之後,建立暫存表(staging table);在Package執行之後,刪除暫存表,當禁用延遲驗證時。當禁用延遲驗證時,驗證操作在Package執行之前,會檢測暫存表是否存在,由於暫存表需要在Package執行之後建立,因此,驗證事件發出錯誤訊息,Package停止執行,這對這種情況,必須使用延遲驗證,在真正引用到暫存表時,延遲暫存表是否存在。

一,延遲驗證屬性

延遲驗證屬性作用於Package,Task,容器(Container)和連結管理器(Connection Manager),預設情況下,禁用延遲驗證,這就意味著,在Package執行時,首先驗證Package,Task,容器和連結管理器引用的物件是否有效,如果有任何物件不存在,那麼驗證失敗,Package停止執行。

在Package開始執行之前,驗證Package,能夠儘早發現錯誤,避免浪費系統資源去執行一個必定會失敗的Package,合理配置,會帶來效能的最佳化。

二,驗證方式

按照驗證的執行順序來看,Package包含兩種型別的驗證方式:

Package Validation:在Package執行時,首先驗證Package及其包含的所有元件,是Package級別的驗證;

元件驗證:元件級別的驗證,包含Task , Connection Manager和Container,在元件開始執行之前,驗證元件中引用物件的有效性。

驗證分為兩個階段(Phrase),首先進行Package級別的驗證,而後進行元件級別的驗證:

Package級別的驗證包含元件級別的驗證,如果禁用延遲驗證,那麼元件級別的驗證會執行兩次,這在設計Package時,不是一個好的選擇,這會增加Package的驗證時間,還會增加每一次開啟Package進行編輯的時間。而啟用延遲驗證,這會禁用了Package 級別的驗證,以至於在Package的設計時(design-time),只執行元件級別的驗證,注意,任何情況下,無法禁用元件級別的驗證。

通常情況下,對一個完成開發的Package啟用延遲驗證,是一個好的選擇,這會減少Package整體的執行時間,因為跳過了Package級別的驗證。

1,禁用延遲驗證

禁用Package的延遲驗證,需要設定Package的DelayValidation屬性值為False,預設情況下,Packag會禁用延遲驗證,如下圖所示:

那麼在Package開始執行之後,第一件事就是開始執行Package Validation,當Package級別的驗證操作完成之後,開始驗證Package包含的各個Task等,如果驗證發現錯誤,Package不會被執行,直接報錯。

2,啟用延遲驗證

啟用Package的延遲驗證,需要設定Package的DelayValidation屬性值為True,如下圖所示:

當啟用延遲驗證時,Package會執行下去,知道執行到特定的元件時,才會執行元件驗證,如果元件驗證失敗,那麼丟擲錯誤訊息,停止Package的執行。

元件驗證發生真正執行元件,如果上流元件新建一個暫存表(staging table),下游元件引用該暫存表,並不會出現異常,這是因為在該元件進行驗證時,該暫存表已經存在。

三,延遲驗證屬性的層次結構

在Package級別上設定DelayValidation屬性並不能阻止開啟Package時的最初的驗證過程,它只是在執行包時延遲Package級別的驗證,這就意味著Package將繼續執行,但是當開啟Package時警報仍然出現。如果想阻止開啟Package時的驗證,那麼必須把Task級別上的DelayValidation屬性設定為True。

避免驗證連結管理器,有時,是一個非常節省開發時間的選擇。有時開啟Package的過程會花費很長的時間,這可能是因為它引用了一個遠端資料來源,而資料來源的響應很緩慢,或者連結不上。如果我們正在開發一個包,並且需要經常開啟這個包,那麼我們可能需要花費很長的時間來等待SSIS驗證一個資料來源。在這樣的情況下,在任務級設定DelayValidation屬性為True可以為我們節省大量的時間。

示例1,驗證操作只會驗證屬性的完整性

設定Package Level的屬性DelayValidation=False,Task Level的屬性DelayValidation=False

Package的處理流程如下圖所示,Package級別的Validation在Create Staging Table的Validation之前開始,在Insert Data的Validation之後結束,從圖中能看到Insert Data的驗證完成,實際上,驗證操作並沒有檢查出一個非常簡單的語法錯誤,直到Task真正執行時,才發現錯誤,這說明,驗證操作只會驗證Task屬性的完整性,效果是有限的。

示例2,驗證操作會驗證引用的物件是否存在

設定Package Level的屬性DelayValidation=False,Task Level的屬性DelayValidation=False,在Data Flow Task中,OLE DB Source元件從一個當前不存在的表dbo.delay_test中selelct資料:

在執行Package時,SSIS彈出“Package Validation Error”窗體,這就是Package級別上的驗證發現的錯誤:

設定Package Level的屬性DelayValidation=False,Task Data Flow Task的屬性DelayValidation=True,重新執行,Package成功執行。

示例3,開啟package的驗證

設定Package Level的屬性DelayValidation=True,Task Level的屬性DelayValidation=False,在開啟Package時,Task Data Flow Task上面是有紅色X號的,當設定Task Level的屬性DelayValidation=True時,在開啟package時,Task Data Flow Task上面的紅色X符號消失,這說明,在開啟Package時,驗證操作已經開始,並且Task 級別的驗證屬性會覆蓋上層的驗證。

以上三個示例說明,在開啟Package,設計Package和執行Package時,SSIS引擎都會對Package進行驗證,並且Package的驗證操作是優層次結構的,底層的延遲驗證會覆蓋上層的延遲驗性。

以上這篇SSIS 延遲驗證方法就是小編分享給大家的全部內容了,希望能給大家一個參考。

原文連結:https://www.cnblogs.com/ljhdo/p/4803531.html

相關文章