我有一个完美的包,直到我决定把它的一些任务放在一个序列容器中(更多关于为什么我想这样做 - How to make a SSIS transaction in my case?)。
现在,我一直在收到错误 -
[Execute SQL Task] Error: Failed to acquire connection "MyDatabase". Connection may not be configured correctly or you may not have the right permissions on this connection.
为什么会发生这种情况?如何解决?
答案 0 :(得分:10)
我开始编写自己的示例来回复您的问题。然后我记得当我在新罕布什尔州的一个SQL周六谈话时我遇到了Matt Mason。他是SSIS的Microsoft程序经理。
虽然我在2009年和2011年之间花了3年时间,但除了ETL代码之外别无他法,我认为马特有一篇文章。
http://www.mattmasson.com/2011/12/design-pattern-avoiding-transactions/
以下是您找到的方法和错误的高级摘要。
[ERROR]
您发现的错误与MSDTC存在问题有关。这必须配置正确,并且没有任何问题。常见问题是防火墙。看看这篇文章。
[解决方案1] - 在包裹,任务或容器级别使用交易。
某些数据提供商不支持MSDTC。某些任务不支持事务。由于您要添加一个新层以支持两个阶段提交,因此性能可能会很慢。
http://technet.microsoft.com/en-us/library/aa213066(v=sql.80).aspx
[解决方案2] - 使用以下任务。
A - BEGIN TRAN(EXECUTE SQL)
B - 您的数据流
C - 测试返回代码
1 - GOOD = COMMIT(EXECUTE SQL)
2 - FAILURE = ROLLBACK(EXECUTE SQL)
您必须在连接上将RetainSameConnection属性设置为True。
这会强制所有通过一个会话或SPID的呼叫。所有事务管理现在都在服务器上。
[SOLUTION 3] - 编写所有代码,以便重新启动。这并不意味着你出去使用检查点。
一种解决方案是始终使用UPSERTS。插入新数据。更新旧数据。删除只是表中的标志。此模式允许在实现相同的最终状态的情况下多次执行失败的作业。
另一种解决方案是通过将所有错误行放入医院检查表进行手动检查,纠正和插入来处理所有错误行。
为什么不使用数据库快照(跟踪刚更改的记录)?在ETL作业之前拍摄快照。如果发生错误,请从快照还原数据库。最后一步是从系统中删除快照以清理房屋。
简而言之,我希望这有足够的想法来帮助你。
虽然交易选项很好,但确实有一些下跌。如果你需要一个例子,请点击我。
此致
Ĵ
答案 1 :(得分:0)
您使用的是什么包保护级别?不要保存敏感?使用用户密钥加密敏感?我建议将其更改为使用加密敏感密码并输入密码。密码不会消失。
您是否尝试在连接管理器中测试与数据库的连接?