我有一个简单的程序包,它将数据从DB2提取到SQL Server数据库。 DB2连接将Microsoft OLE DB提供程序用于DB2驱动程序。将数据库连接字符串表示为表达式,因为必须将解决方案部署到进行不同配置的Integration Services目录(其他ICS)的不同环境中。例如,在TEST环境中,将TestUser配置为连接到DB2测试数据库,以此类推,在Acceptance和Prod环境中。
解决方案的ProtectionLevel设置为 DontSaveSensitive 。
用于连接的解决方案变量在项目参数中声明。密码设置为敏感,因此值不会存储在程序包中,而必须由ICS环境属性提供,密码值也存储为敏感。
连接的表达式:
"Data Source=" + @[$Project::DB2DataSource] + ";User ID=" + @[$Project::DB2UserId]+ ";Initial Catalog=" + @[$Project::DB2InitialCatalog] + ";Provider=DB2OLEDB.1;Persist Security Info=True;Network Address=" + @[$Project::DB2NetworkAddress] + ";Network Port=" + @[$Project::DB2NetworkPort] + ";Package Collection=NULLID;"
评估为:
Data Source=DB2test;User ID=myUser;Initial Catalog=DB2test;Provider=DB2OLEDB.1;Persist Security Info=True;Network Address=DB2test;Network Port=99999;Package Collection=NULLID;
密码在DB2 Connections属性中作为密码表达式单独提供。我将其与ConnectionString分开了,因为密码设置为 Sensitive ,所以ConnectionString表达式无法求值,如图: DB2 Connection properties 好吧,至少我希望它能那样工作。在开发过程中,我将密码更改为“不敏感”,因此我可以通过Visual Studio测试流程,并且可以正常工作。部署到ICS时,我将密码更改为Sensitive,因为ICS环境密码变量设置为Sensitive,并且软件包和ICS环境中的状态都必须匹配。
在ICS流程不起作用的情况下,我总是遇到一些连接错误。 ICS env中的DB2连接变量与解决方案属性中的相同,因此值不是失败的原因。一种运行错误的示例:
错误:SSIS错误代码 DTS_E_CANNOTACQUIRECONNECTIONFROMCONNECTIONMANAGER。的 对连接管理器“ DB2_user”的AcquireConnection方法调用 失败,错误代码为0xC0202009。可能发布了错误消息 在此之前,详细了解为什么AcquireConnection方法 通话失败。
Extract_DB2_Db2PasyIsoExtract:Error:SSIS错误代码DTS_E_OLEDBERROR。 发生OLE DB错误。错误代码:0x80040E73。 OLE DB记录 可用。来源:“ Microsoft OLE DB服务组件”结果: 0x80040E73说明:“初始化字符串的格式不正确 符合OLE DB规范。”。
所以看起来好像有一些连接字符串。也许密码未正确通过?我找不到合适的方法来通过ICS调试生成的ConnectionString。
也许我应该注意一些安全设置?由于特定的部署过程,无法使用其他ProtectionLevel选项。欢迎任何意见或方法建议!
答案 0 :(得分:1)
我能够找出问题所在,简短的回答是,由于Microsoft OLE DB Provider for DB2驱动程序版本之间的环境差异,SSIS包失败了。
我的工作站和TEST环境具有用于DB2版本4.0的Microsoft OLE DB提供程序。 SYST和PROD具有较旧的版本,它们不支持SQL脚本任务中的参数。例如,较旧版本的驱动程序不支持SELECT * FROM dbo.Customers WHERE Id > ?
。
我怀疑动态连接字符串,但是它们按预期工作。
这个问题很简单,但是花了很长时间才发现驱动程序不同,这会引起问题。
答案 1 :(得分:0)
建议:对于正确的连接字符串,请使用Microsoft数据访问工具。 它与DB2OLEDBV6_x64.msi一起安装,它是SQL SERVER 2016 SP2 Feature Pack的一部分