2

我有大约 85 个使用相同连接管理器的 SSIS 包。我知道每个包都有自己的连接管理器。我正在尝试根据包所在的服务器来决定简单地设置连接管理器的连接字符串的最佳配置方法。我已经在网上访问了各种建议,但在任何地方都找不到我可以简单地将配置从一个包复制到其余包的做法。显然有很多方法,例如 XML 文件、SQL Server、环境变量等。

那里的所有文章都指向通过使用 XML 或 SQL 方法来使用间接方法。为什么只使用环境变量来保存连接字符串是一种糟糕的方法?

任何建议都受到高度赞赏。

谢谢!

4

1 回答 1

5

为什么只使用环境变量来保存连接字符串是一种糟糕的方法?

我发现环境变量或注册表项配置方法受到严重限制,因为它一次只能配置一项。对于连接字符串,您需要为给定服务器上的每个目录定义一个环境变量。也许它只有 2 或 3 个,这是可以管理的。我们每个数据库实例有 30 多个实例,并且我们有多实例机器,因此您可以看到这个问题有多快演变成维护噩梦。与可以为给定配置键保存多个配置项的基于表或 xml 的方法进行对比。

...最佳配置方法,可以根据包所在的服务器简单地设置连接管理器的连接字符串。

如果你走这条路,我建议创建一个变量 ConnectionString 并使用它来配置属性。这是一个额外的步骤,但我再次发现调试变量上的复杂表达式与属性上的复杂表达式相比更容易。使用变量,您始终可以在包上弹出断点并查看本地窗口以查看当前值。

创建一个名为 ConnectionString 的变量后,我右键单击它,选择 Properties 并将 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;

如果您有比一个变量更复杂的配置需求,那么我可以看到您使用它来配置一个连接管理器到一个包含所有配置键和值的完整存储库的 sql 表。

...在任何地方都找不到我可以简单地将配置从一个包复制到其余包的做法

我将通过编程路线修改所有 80something 包。我们从第三方收到了一批包裹,但他们没有遵循我们的配置和日志记录程序。代码并不难,如果您准确描述为解决您的需求所做的更改类型,我很乐意将一些代码扔到这个答案上。它可以像下面这样简单。调用该函数后,它将通过将 SSISDB ole 连接管理器上的 sql server 配置添加到名为 dbo.sysdtsconfig 的表中,以用于名为 Default.2008.Sales 的过滤器来修改包。

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 回答