2

在我决定将它的一些任务放入序列容器之前,我有一个运行良好的包(更多关于我为什么要这样做 -如何在我的情况下进行 SSIS 事务?)。

现在,我不断收到错误 -

[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.

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

4

2 回答 2

10

我开始编写自己的示例来回答您的问题。然后我记得我在新罕布什尔州的一个 SQL 星期六谈话时遇到了马特梅森。他是 SSIS 的 Microsoft 项目经理。

虽然我在 2009 年到 2011 年间花了 3 年时间只写 ETL 代码,但我认为 Matt 有一篇文章。

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

这是您发现的方法和错误的高级摘要。

[错误]

您发现的错误与 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 - 开始传输(执行 SQL)

B - 您的数据流

C - 测试返回码

1 - 好 = 提交(执行 SQL)

2 - 失败 = 回滚(执行 SQL)

您必须将连接上的 RetainSameConnection 属性设置为 True。

这会强制所有呼叫通过一个会话或 SPID。所有事务管理现在都在服务器上。

[解决方案 3] - 编写所有代码,使其可重新启动。这并不意味着你出去使用检查站。

一种解决方案是始终使用 UPSERTS。插入新数据。更新旧数据。删除只是表中的一个标志。这种模式允许多次执行失败的作业,并达到相同的最终状态。

另一种解决方案是通过将所有错误行放入医院表中进行手动检查、更正和插入来处理它们。

为什么不使用数据库快照(跟踪刚刚更改的记录)?在 ETL 作业之前拍摄快照。如果发生错误,请从快照中恢复数据库。最后一步是从系统中删除快照以清理房屋。

简而言之,我希望这是足够的想法来帮助你。

虽然交易选项很好,但确实有一些下跌。如果你需要一个例子,只需 ping 我。

真挚地

Ĵ

于 2013-11-14T21:03:43.647 回答
0

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

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

于 2013-11-12T19:23:01.227 回答