1

さまざまな環境 (DEV、UAT、PROD) のすべてのサーバーをループするパッケージを作成します。サービス アカウントを使用します。DEV と UAT 用に 1 つのサービス アカウントがあり、PROD 用に別のサービス アカウントがあります。ForEach ループ コンテナー/変数を使用して接続文字列を設定しています。

問題: ループ内のデータ フローが PROD サーバーに接続しようとすると、明らかに PROD にアクセスできない DEV/UAT サービス アカウントを使用しているため、接続に失敗します。問題は、これがループを殺すことです。通常は、データ フローにイベント ハンドラーを配置し、イベント ハンドラーのシステム変数 Propagate:OnError = False を設定して、エラーがループに到達して強制終了しないようにします。データ フロー内の OLE DB 接続が検証中 (パッケージの実行中) に失敗し、明らかに Propagate = False 設定は、タスクの実行中にエラーが発生した場合にのみエラーが発生するのを防ぎます。タスクの検証。

パッケージ自体を含むすべてに MaximumErrorCount = 0 を設定できますが、これは少し手間がかかり、どのようなエラーが発生しても、パッケージは常に正常に実行されたと報告されます。

SQL Server 2008-R2 の実行

誰かが慣れていない場合は、伝播設定を使用してループを強制終了しない方法に関する記事へのリンク。

4

1 に答える 1

2

1 つの提案として、try-catch ブロックを使用して接続文字列へのアクセスをチェックし、失敗時に変数を設定するデータ フロー タスクの前にスクリプト タスクを配置し、その変数を条件付き分割で使用して、データ フロー タスクを実行するかどうかを決定します。接続文字列が失敗したことを示すフローまたはログ。

または、失敗した理由を気にしない場合 (アクセス許可が原因であることが既にわかっているため)、優先順位制約を使用して、接続が成功したデータ フローのみを実行することもできます。

アップデート:

スクリプト タスクの作業コードを次に示します。

 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. ForEach ループから接続文字列を作成するために使用している変数をReadOnlyVariablesに追加します。私はConnectionStringToTestという名前を付けました。
  4. 上記のスクリプト コードを Main() 関数として追加します。これはOleDbConnectionを使用していることに注意してください。これは、データ フローで変更している接続マネージャーに使用している接続を模倣する必要があります。そのため、SQL 接続の場合は、代わりにSqlConnectionを使用してください。
  5. コードでは、DatabaseCanConnect 変数を使用して、ここからのフローを決定します。Precedence Constraint で使用して、データ フローへのフローを防止したり、Conditional Split (私の好みで、他の開発者に表示されやすい) で使用して、失敗時に接続エラーをログに記録し、それ以外の場合は通常どおり続行することができます。
于 2013-03-09T14:40:55.110 に答える