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

SQL Server linked server error "The partner transaction manager has disabled its support for remote/network transactions."

我有一个链接服务器(SQL 服务器 14.0.1000.169)。本地服务器(SQL 服务器 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 工作后的原始查询,由于触发器,我只是将 Table46 更改为 inserted 虚拟 table。

编辑 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:

我已遵循 these instructions 并在两台服务器的防火墙中都允许 MSDTC 入站规则,但现在如果我尝试添加该行,查询将花费大量时间执行,它尚未完成。对 Table46.

SELECT 查询也会发生同样的情况

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

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

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

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