【发布时间】:2015-09-09 13:50:36
【问题描述】:
我有两台不同的 SQL 2008 服务器,我无权在其中任何一台服务器上创建链接服务器。 我在 server1.table1 上创建了一个触发器,以使用 OPENROWSET 将相同的记录插入到远程服务器 server2.table1
我创建了一个存储过程来插入这条记录,当我执行存储过程时我没有问题。它将录制的内容插入到远程服务器中。
问题是当我从触发器调用存储过程时,我收到一条错误消息。
谁能帮我解决这个问题
存储过程:
USE [DB1]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
alter PROCEDURE [dbo].[InsertIntoRemoteTable]
@Description nvarchar(50)
AS
insert into
OPENROWSET(
'SQLNCLI', 'Server=Server2;UID=MySRV2user;PWD=MySRV2Password',
'SELECT Description FROM [RemoteDB].[dbo].[Table_1]')
SELECT @Description
触发器:
ALTER TRIGGER [dbo].[InsertTable1]
ON [DB1].[dbo].[Table_1]
for insert
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Desc nvarchar(50)
Select @Desc = i.Descr from INSERTED i;
EXEC InsertIntoRemoteTable @Desc
END
当我尝试在表中插入新的描述值时,我收到以下错误消息:
"No row was updated
the data in row 1 was not committed
Error source .Net SqlClient Data provider.
Error Message: the operation could not be performed because OLE DB
provider "SQLNCLI10" for linked server "(null)" returned message "The partner transaction manager has disabled its support for remote/network transaction.".
correct the errors entry or press ESC to cancel the change(s).
有人可以帮忙吗 谢谢
【问题讨论】:
-
您的触发器存在重大缺陷。它假设只会插入一行。您需要编写触发器来处理数据集。在这种情况下,最可能的意思是修改过程 InsertIntoRemoteTable 以接收表值参数而不是标量值。至于错误信息...您是否尝试研究它?搜索错误消息会提供成千上万个链接,这些链接解释了该消息以及如何修复它。
-
我真的没有仔细看你的程序。那里的参数有什么意义?你传入它,然后在最后选择它。另一个有趣的部分是您只需将 Table_1 中的所有行插入到远程表中。这将在 wazoo 中产生重复,因为它只是一遍又一遍地插入相同的行。我认为您需要分析您的流程并弄清楚您要在这里做什么。
-
该参数是新插入的字段值,所以当新记录插入table1时,触发器调用过程并发送字段值将这些值插入远程表中
-
但是看看你的插入语句。它不只是获得那一行,它从 Table_1 中获得所有行。老实说,我根本不知道你为什么在这里使用 OPENROWSET。为什么不直接在触发器中简单地插入?
-
我没有插入所有行,我试图只插入新插入的记录
标签: sql-server sql-server-2008 stored-procedures triggers