将任务放入序列容器后无法连接到数据库

时间:2013-11-08 21:58:47

标签: sql-server ssis

我有一个完美的包,直到我决定把它的一些任务放在一个序列容器中(更多关于为什么我想这样做 - 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.

为什么会发生这种情况?如何解决?

2 个答案:

答案 0 :(得分:10)

我开始编写自己的示例来回复您的问题。然后我记得当我在新罕布什尔州的一个SQL周六谈话时我遇到了Matt Mason。他是SSIS的Microsoft程序经理。

虽然我在2009年和2011年之间花了3年时间,但除了ETL代码之外别无他法,我认为马特有一篇文章。

http://www.mattmasson.com/2011/12/design-pattern-avoiding-transactions/

以下是您找到的方法和错误的高级摘要。

[ERROR]

您发现的错误与MSDTC存在问题有关。这必须配置正确,并且没有任何问题。常见问题是防火墙。看看这篇文章。

http://social.msdn.microsoft.com/Forums/sqlserver/en-US/3a5c847e-9c7e-4628-b857-4e6edaa7936c/sql-task-transaction-required?forum=sqlintegrationservices

[解决方案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)

您使用的是什么包保护级别?不要保存敏感?使用用户密钥加密敏感?我建议将其更改为使用加密敏感密码并输入密码。密码不会消失。

您是否尝试在连接管理器中测试与数据库的连接?