SQL 服务器链接服务器错误"The partner transaction manager has disabled its support for remote/network transacti



我有一个链接服务器(SQL Server 14.0.1000.169(。本地服务器 (SQL Server 10.0.1600( 在短时间内(大约每分钟 1 行(将数据接收到Table46中。我需要将此新行的一些信息传递给链接服务器,因此我在本地服务器中为此创建了一个触发器:

CREATE TRIGGER New_Event 
ON  dbo.Table46 FOR INSERT AS 
BEGIN
SET NOCOUNT ON;
INSERT INTO [LinkedServer].[Database].[dbo].[TableEvents]
SELECT    i.[046_ID] AS [id]
, NP.NoPart + ' ' + CONVERT(VARCHAR(3), T41.[041_No]) AS [name]
, DATEADD(MINUTE, -1 * i.[046_ExeTime], i.[046_DateTime]) AS [eventstart]
, i.[046_DateTime] AS [eventend]
, i.[046_IDRes] AS [resource_id]
, i.[046_ExeTime] AS [execution]
, ISNULL(MIN(T48.[048_MachTime]), 0) AS [same]
, ISNULL(MIN(T48_1.[048_MachTime]), 0) AS [all]
, i.[046_Pallet] AS [pallet]
FROM inserted AS i
INNER JOIN Table41 AS T41
ON i.[046_IDOp] = T41.[041_IDOp]
INNER JOIN NoParts AS NP
ON T41.[041_IDNoPart] = NP.Autonumber
INNER JOIN Table48 AS T48
ON i.[046_IDRes] = T48.[048_IDRes]
AND i.[046_IDOp] = T48.[048_IDOp]
INNER JOIN Table48 AS T48_1
ON i.[046_IDOp] = T48_1.[048_IDOp]
GROUP BY i.[046_ID], NP.NoPart, T41.[041_No], i.[046_MachTime], 
i.[046_DateTime], i.[046_IDRes], i.[046_ExeTime], i.[046_Pallet];
END;

INSERT INTO后的原始查询工作,由于触发器,我只是更改了inserted虚拟表的Table46

编辑 1:

如果我手动添加新行以Table46则会出现以下错误(已启动MSDTC服务(:

OLE DB provider "SQLNCLI10" for linked server "[LinkedServer]" returned message "The partner transaction manager has disabled its support for remote/network transactions.".
Msg 7391, Level 16, State 2, Procedure New_Event, Line 5 [Batch Start Line 15]
The operation could not be performed because OLE DB provider "SQLNCLI10" for linked server "[LinkedServer]" was unable to begin a distributed transaction.

编辑 2:

我已经按照这些说明进行操作,并且还允许两台服务器的防火墙中的MSDTC入站规则,但是现在,如果我尝试添加该行,则查询需要花费大量时间执行,它尚未完成。同样的情况也发生在SELECT查询中Table46.

如果触发器不起作用,每当Table46收到新行时,还有什么其他方法可以插入远程服务器?

如我的评论中所述,您需要配置 MSDTC 以启用两个链接的 SQL 服务器之间的分布式事务。

如果您不想这样做,则可以在源表上使用触发器将所需的数据保存在"队列"表中。然后,您可以让单独的应用程序轮询队列表,获取数据并将它们插入链接服务器上的单独连接(从而单独的事务(。这种方法可能看起来不是最佳的,但确实有一个优点:如果链接服务器不可用或速度很慢,源服务器将继续全速工作,并且不会丢失任何数据。

实现第二种方法的一种方法是使用 SQL Server 代理。在触发器中,将必要的数据发送到消息队列。在接收(链接(服务器上处理消息并将数据插入TableEvents中。SQL Server Broker 始终确保事务完整性,而无需在两台服务器之间使用 MSDTC,同时解耦两台服务器。请注意,不再需要链接服务器(除非您出于其他原因需要链接它们(

相关内容

最新更新