1

創建一個將在我們的不同環境(DEV,UAT,PROD)中循環遍歷所有服務器的程序包。我們使用服務帳戶,DEV和UAT有一個服務帳戶,另一個服務帳戶用於PROD。我正在使用ForEach循環容器/變量來設置連接字符串。SSIS通過服務器循環並處理登錄失敗

問題:當環路中的數據流嘗試連接到PROD服務器時,它們會失敗,因爲它們使用明顯無法訪問PROD的DEV/UAT服務帳戶,這很好。問題是這會殺死循環。通常,我只是在數據流上放置一個事件處理程序,並設置事件處理程序的系統變量傳播:OnError = False,以便錯誤不會回滾到循環並殺死它。那麼這是行不通的,因爲數據流中的OLE DB連接在驗證期間(包運行時)失敗,顯然Propagate = False設置只會在執行任務期間發生冒泡錯誤,而不會發生錯誤驗證任務。

我可以在包括軟件包本身的所有設置上設置MaximumErrorCount = 0,但這有點沉重,並且無論遇到什麼錯誤,軟件包總是會報告它成功運行。

運行SQL Server 2008的R2

Link就怎麼殺不使用傳播,如果有人不熟悉它設置你的循環的文章。

回答

2

一個建議是在數據流任務之前放置一個腳本任務,它使用try-catch塊檢查對連接字符串的訪問,並在失敗時設置變量,然後在條件拆分中使用該變量來確定是否運行數據流或記錄連接字符串失敗。或者,如果您不在乎它爲什麼失敗(因爲您已經知道這是因爲權限),您可以只使用Precedence Constraint並且只在連接成功的位置運行Data Flows。

UPDATE:

下面是腳本任務的一些工作代碼:

public void Main()   { 

string connString = Dts.Variables["ConnectionStringToTest"].Value; 

       try    { 
        using (OleDbConnection connection = new OleDbConnection()) { 
         connection.ConnectionString = connString; 
         connection.Open(); 
        } 
        Dts.Variables["User::DatabaseCanConnect"].Value = true;     
       } 
       catch (Exception ex) { 
        Dts.Variables["User::DatabaseCanConnect"].Value = false; 
       } 

       Dts.TaskResult = (int)ScriptResults.Success; 
      } 
  1. 創建一個名爲DatabaseCanConnect在包範圍的變量。將其設置爲布爾值,它將默認爲False。
  2. 創建腳本任務。編輯ReadWriteVariables屬性並添加您的新變量。
  3. 加入您的ReadOnlyVariables無論您用於從ForEach循環中構建連接字符串的變量。我已經命名爲我的ConnectionStringToTest
  4. 將上面的腳本代碼添加爲Main()函數。請注意,這使用一個OleDbConnection。這應該模仿您在您的數據流中修改的連接管理器所使用的任何連接。因此,如果它是SQL連接,請改用SqlConnection
  5. 在您的代碼中,使用DatabaseCanConnect變量來確定此處的流程。您可以在Precedence Constraint中使用它,以防止流向數據流,或者在條件拆分(我的首選項,其他開發人員更易於看到)中將其用於記錄失敗時的連接錯誤,否則正常繼續。
+0

我以爲一個腳本任務可能能夠提供我正在尋找的解決方案。非常感謝你。 – swegs 2013-03-11 15:06:23