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 的情况下,始终确保事务完整性。请注意,服务器不再需要链接(除非您出于其他原因需要链接它们)
我有一个链接服务器(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 的情况下,始终确保事务完整性。请注意,服务器不再需要链接(除非您出于其他原因需要链接它们)