我在服务器 #1 上设置了 SQL 链接服务器来访问服务器 #2。 当我在服务器 #1 上的 SSMS 中运行更新或插入语句来更改服务器 #2 中的数据时,它会起作用。 现在我在表(服务器 #1 上)的触发器中使用完全相同的 UPDATE 语句,然后它失败并出现错误:
返回链接服务器“172.xx.xx.02”的 OLE DB 提供程序“SQLNCLI11” 消息“没有交易处于活动状态。”。消息 7391,16 级,状态 2, 过程 MyProc,第 12 行 操作无法执行,因为 链接服务器“172.xx.xx.02”的 OLE DB 提供程序“SQLNCLI11”为 无法开始分布式事务。
由于正常的 UPDATE/INSERT 正在工作,我将假设 DTC 设置正确并且工作正常(或者这是一个错误的假设?)。 由于网络上几乎所有帮助都涉及 DTC,因此我无论如何都会在下面粘贴我的 DTC 设置。还有什么可能吗? (在任何人批评链接服务器之前,是的,我知道它很旧,不是首选方式,但现在无法更改它 - 它是一个遗留系统)。
我的触发器看起来像这样:
ALTER TRIGGER [dbo].[MyTrigger]
ON [dbo].[Table1]
FOR UPDATE, INSERT
AS
BEGIN
INSERT INTO [172.xx.xx.02].SomeDB.dbo.MyTable (Field1, Field2)
VALUES ('34172', GETDATE())
END
故障码:
“
was unable to begin a distributed transaction
”:
如果链接服务器属性中的“
Enable Promotion of Distributed Transactions
”设置为 False,则可能是问题的原因。设置为 false 时,意味着 Microsoft SQL Server 将不会使用 Microsoft 分布式事务协调器 (MS DTC) 来协调分布在 SQL Server 多个实例中的事务。
尝试将“启用分布式事务推广”更改为True。
您可能需要重新启动 SQL 服务才能使更改生效。
除此之外,请尝试按照 Microsoft 官方页面进行操作:“使用 MSDTC 进行故障排除”。
如果将“
Enable Promotion of Distributed Transactions
”更改为 True
未能解决问题,并且 DTC 似乎设置正确,则可能有其他原因导致该行为。
触发器就其本质而言,在触发它们的操作范围内执行。如果外部操作(触发触发器的 INSERT 或 UPDATE)已经在事务内,然后触发器尝试执行分布式操作,这可能会出现问题。
考虑原始操作是否包含在事务中以及这是否可能是原因。
并确保在服务器 #1 和服务器 #2 上运行 SQL Server 的帐户具有足够的权限来启动分布式事务。
如果触发器影响多个数据库(即使在同一服务器上),SQL Server 可能会将事务提升为分布式事务。如果这些数据库中的任何一个是只读的或有其他一些限制,则可能会导致错误。
替代方法,作为解决方法(不一定是直接解决方案)