【问题标题】:SQL Server 2008: MERGE command on a table that has a trigger causes an errorSQL Server 2008:具有触发器的表上的 MERGE 命令导致错误
【发布时间】:2011-08-25 06:32:12
【问题描述】:

我有一个使用MERGE 命令将dbo.tableA 与[mylinkedserver].dbo.TableA 同步的存储过程。

TableA 有一个与之关联的插入/更新触发器。为了让事情变得非常简单,触发器所做的就是

print 'I am a simple trigger because i dont want to cause errors'

当 SP 被执行时(通过 .net windows 应用程序),它会抛出这个错误:

链接服务器“MyLinkedServer”的 OLE DB 提供程序“SQLNCLI10” 返回消息“没有交易是 活跃。”

如果我删除触发器并再次执行存储的过程,它执行得非常好。

如果我通过 SSMS 运行存储过程(使用触发器),它也可以正常运行。

在两台服务器上都启用了 MSDTC。

服务器是 Windows 2008 服务器,SQL Server 2008 和 Service Pack 2。

为什么触发器会导致这个错误?!?!??

【问题讨论】:

标签: sql-server merge windows-server-2008


【解决方案1】:

使用 Merge 实现触发器有点棘手。归结为“对于合并语句中指定的每个操作,都必须有一个触发器”。

TechNet 说“如果目标表上定义了一个启用的 INSTEAD OF 触发器,用于由 MERGE 语句执行的插入、更新或删除操作,那么它必须有一个启用的 INSTEAD OF 触发器,用于在MERGE 语句。”

http://technet.microsoft.com/en-us/library/bb510625.aspx

【讨论】:

  • 我为插入、更新、删除创建了 3 个单独的触发器(因为这些是 MERGE 命令执行的操作)。所有这些都带有简单的打印语句。仍然没有运气。触发器中没有 INSTEAD OF。
  • 我也试过只用一个触发器来插入。还是没有运气。
  • 这是否意味着您删除了所有链接服务器的内容,并且表上带有触发器的合并语句会导致错误?错误信息有变化吗?
  • 没有链接服务器的东西仍然存在。我仍在尝试将 dbo.tableA 与 [mylinkedserver].dbo.TableA 合并。我刚刚更改了 dbo.tableA 上的触发器。
  • 如果我使用不同的跳跳器进行插入和更新工作正常
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-31
  • 1970-01-01
  • 2011-04-04
  • 1970-01-01
  • 2012-06-03
  • 2014-01-19
相关资源
最近更新 更多