2

同じ接続マネージャーを使用している約 85 個の SSIS パッケージがあります。各パッケージには独自の接続マネージャーがあることを理解しています。パッケージが存在するサーバーに基づいて接続マネージャーの接続文字列を設定するための最良の構成アプローチを決定しようとしています。オンラインであらゆる種類の提案にアクセスしましたが、あるパッケージから残りのパッケージに構成を単純にコピーできるプラクティスはどこにも見つかりません。XMLファイル、SQL Server、環境変数など、明らかに多くのアプローチがあります。

そこにあるすべての記事は、XML または SQL アプローチを使用して間接的な方法を使用することを指摘しています。接続文字列を保持するためだけに環境変数を使用するのは、なぜそんなに悪いアプローチなのでしょうか?

どんな提案でも大歓迎です。

ありがとう!

4

1 に答える 1

5

接続文字列を保持するためだけに環境変数を使用するのは、なぜそんなに悪いアプローチなのでしょうか?

環境変数またはレジストリ キーの構成方法は、一度に 1 つの項目しか構成できないという事実によって、大幅に制限されることがわかりました。接続文字列の場合、特定のサーバー上のカタログごとに環境変数を定義する必要があります。多分それは2つまたは3つだけで、それは管理可能です. データベース インスタンスごとに 30 以上のインスタンスがあり、複数インスタンスのマシンがあったため、この問題がメンテナンスの悪夢に発展する速さがわかります。特定の構成キーに対して複数の構成アイテムを保持できるテーブルまたは xml ベースのアプローチとは対照的です。

...パッケージが存在するサーバーに基づいて、接続マネージャーの接続文字列を設定するだけの最適な構成アプローチ。

このルートに進む場合は、変数 ConnectionString を作成し、それを使用してプロパティを構成することをお勧めします。これは余分な手順ですが、プロパティの複雑な式よりも変数の複雑な式をデバッグする方が簡単であることがわかりました。変数を使用すると、いつでもパッケージにブレークポイントをポップし、ローカル ウィンドウを見て現在の値を確認できます。

ConnectionString という名前の変数を作成したら、それを右クリックして [プロパティ] を選択し、EvaluateAsExpression を True に設定し、Expression プロパティを次のように設定します。"Data Source="+ @[System::MachineName] +"\\DEV2012;Initial Catalog=FOO;Provider=SQLNCLI11.1;Integrated Security=SSPI;"

それが評価されると、現在のマシンの名前 (DEVSQLA) が入力され、名前付きインスタンス DEV2012 に接続する有効な OLE DB 接続文字列が得られます。

Data Source=DEVSQLA\DEV2012;Initial Catalog=FOO;Provider=SQLNCLI11.1;Integrated Security=SSPI;

1 つの変数だけでなく、より複雑な構成が必要な場合は、これを使用して、すべての構成キーと値の完全なリポジトリを保持する SQL テーブルに接続マネージャーを構成することができます。

...あるパッケージから残りのパッケージに構成を単純にコピーできるプラクティスはどこにも見つかりません

私なら、80 代のすべてのパッケージをプログラム ルートで変更します。サードパーティからパッケージのパッセルを受け取りましたが、構成とログの手順に従っていませんでした。コードはそれほど難しくありませんでした。ニーズを解決するために行う変更の種類を正確に説明していただければ、この回答にいくつかのコードを追加できます。次のように簡単にできます。関数を呼び出した後、SSISDB ole 接続マネージャーの SQL サーバー構成を、Default.2008.Sales という名前のフィルターの dbo.sysdtsconfig というテーブルに追加することで、パッケージを変更します。

string currentPackage = @"C:\Src\Package1.dtsx"

public static void CleanUpPackages(string currentPackage)
{
    p = new Package();
    p.app.LoadPackage(currentPackage, null);
    Configuration c = null;

    // Apply configuration Default.2008.Sales
    // ConfigurationString => "SSISDB";"[dbo].[sysdtsconfig]";"Default.2008.Sales"
    // Name => MyConfiguration
    c = p.Configurations.Add();
    c.Name = "SalesConfiguration";
    c.ConfigurationType = DTSConfigurationType.SqlServer;
    c.ConfigurationString = @"""SSISDB"";""[dbo].[sysdtsconfig]"";""Default.2008.Sales""";

    app.SaveToXml(sourcePackage, p, null);
}

パッケージに変数を追加しても、それほど多くのコードは必要ありません。クリーンアップ プロシージャ内で、次のようなコードを追加して、上記のような式を持つ新しい変数をパッケージに追加します。

string variableName = string.Empty;
bool readOnly = false;
string nameSpace = "User";
string variableValue = string.Empty;
string literalExpression = string.Empty;

variableName = "ConnectionString";
literalExpression = @"""Data Source=""+ @[System::MachineName] +""\\DEV2012;Initial Catalog=FOO;Provider=SQLNCLI11.1;Integrated Security=SSPI;""";

p.Variables.Add(variableName, readOnly, nameSpace, variableValue);
p.Variables[variableName].EvaluateAsExpression = true;
p.Variables[variableName].Expression = literalExpression;

私が何かを見逃した場合、またはポイントについて明確にしたい場合はお知らせください。

于 2012-07-18T19:19:34.837 に答える