簡體   English   中英

將SSIS程序包配置應用於多個程序包

[英]Applying SSIS Package Configuration to multiple packages

我大約有85個使用相同連接管理器的SSIS軟件包。 我知道每個程序包都有自己的連接管理器。 我試圖確定哪種最佳配置方法是根據軟件包所駐留的服務器來簡單地設置連接管理器的連接字符串。 我已經在線訪問了各種各樣的建議,但是找不到任何可以簡單地將配置從一個軟件包復制到其余軟件包的實踐。 顯然有很多方法,例如XML文件,SQL Server,環境變量等。

那里的所有文章都指向通過XML或SQL方法使用間接方法。 為什么使用環境變量僅保留連接字符串會是一種不好的方法?

任何建議都將受到高度贊賞。

謝謝!

為什么使用環境變量僅保留連接字符串會是一種不好的方法?

我發現環境變量或注冊表項配置方法受到嚴格限制,因為它一次只能配置一項。 對於連接字符串,您需要為給定服務器上的每個目錄定義一個環境變量。 也許只有2或3,這是可以管理的。 每個數據庫實例有30+個好實例,並且有多實例計算機,因此您可以看到此問題爆發到維護噩夢的速度。 與基於表或xml的方法相反,該方法可以為給定的配置鍵保存多個配置項。

...最佳配置方法是根據軟件包所駐留的服務器來簡單地設置連接管理器的連接字符串。

如果走這條路線,我建議創建一個變量ConnectionString並使用它來配置屬性。 這是一個額外的步驟,但是我再次發現,調試變量上的復雜表達式比屬性上的復雜表達式更容易。 使用變量,您可以始終在程序包上彈出一個斷點,並查看locals窗口以查看當前值。

創建名為ConnectionString的變量后,我右鍵單擊它,選擇Properties並將EvaluateAsExpression設置為True,並將Expression屬性設置為類似"Data Source="+ @[System::MachineName] +"\\\\DEV2012;Initial Catalog=FOO;Provider=SQLNCLI11.1;Integrated Security=SSPI;"

對該值進行評估時,它將填充當前計算機的名稱(DEVSQLA),並且我將具有一個有效的OLE DB連接字符串,該字符串連接到命名實例DEV2012。

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

如果您不僅有一個變量而需要更復雜的配置,那么我會看到您使用它來將連接管理器配置為一個sql表,該表包含所有配置鍵和值的完整存儲庫。

...找不到任何可以簡單地將配置從一個軟件包復制到其余軟件包的實踐

我將通過編程途徑修改所有80年代的軟件包。 我們從第三方那里收到了一攬子軟件包,他們沒有遵循我們的配置和日志記錄程序。 代碼並不難,如果您確切描述了為滿足需求而進行的更改的類型,我很樂意將一些代碼拋給這個答案。 它可能如下所示。 調用該函數后,它將通過在SSISDB ole連接管理器上向名為dbo.sysdtsconfig的表中添加名為Default.2008.Sales的篩選器的SQL Server配置來修改程序包。

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;

讓我知道我是否有任何遺漏,或者您想在任何方面進行澄清。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM