我有一个我创建的SSIS包。几年前我和SSIS一起工作过,所以我生锈了:)。
我有3个连接管理器 - DataWarehouse,DataWarehouse_PROD,DataWarehouse_TEST。
我正在尝试将DataWarehouse_PROD或DataWarehouse_TEST连接管理器中的连接字符串分配给DataWarehouse连接管理器,具体取决于使用脚本任务可能是PROD或TEST的另一个Package变量。
我已经在dtsconfig文件中手动编辑了每个连接管理器的密码和连接字符串属性(每个论坛条目都说明了这一点)。我假设我可以从脚本任务中加载的包配置中检索连接字符串和密码值。当我拉动连接时,我发现密码被剥离了。以下是我的代码片段:
string connectionString = Dts.Connections["ACORDDataWarehouse_PROD"].ConnectionString;
Dts.Connections["ACORDDataWarehouse"].ConnectionString = connectionString;
当我检查代码中的connectionString变量时,password属性不是连接的一部分。如果我手动将密码添加到代码中的连接字符串,连接设置正确,我可以检索数据。根据我在使用程序包配置时所阅读的内容,在将程序包加载到SSIS中时会读取配置,因此这些手动更改应该在那里。
我错过了什么。 。
感谢您的帮助。 汤姆
答案 0 :(得分:1)
我找到了一些讨论使用表达式的线程。我创建了2个Package变量 - 一个用于Environment,另一个用于Password。我确实将ProtectionLevel设置为EncryptAllWithPassword。对于需要动态的Connection Manager,我在Expression Builder中为ConnectionString属性指定了一个Expression,它设置Test或Prod的值。这是一个简单的解决方案。
感谢您的建议!
我想补充一些评论以澄清我的解决方案。很多时候我找到了可能的解决方案,但写的有点不完整。
我最终使用间接包配置来处理我需要的2个变量 - 环境和密码。表达式在加载包时获取值。下面是我在Connection Manager属性中使用的表达式。此外,当您更改服务器上间接.dtsx文件中的值时,您必须再次重新部署相同的程序包才能使更改生效。
@[User::Environment] == "Prod"?"Data Source=ProdServer;User ID=ProdUsername;Password="
+ @[User::Password] + ";Initial Catalog=ProdDatabase;Provider=SQLNCLI10.1;Auto
Translate=False;":"Data Source=TestServer;User ID=TestUsername;Password=" +
@[User::Password] + ";Initial Catalog=TestDatabase;Provider=SQLNCLI10.1;Auto
Translate=False;"