Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在每个插入的行上触发fire以插入到远程表中_Sql Server_Sql Server 2008_Stored Procedures_Triggers - Fatal编程技术网

Sql server 在每个插入的行上触发fire以插入到远程表中

Sql server 在每个插入的行上触发fire以插入到远程表中,sql-server,sql-server-2008,stored-procedures,triggers,Sql Server,Sql Server 2008,Stored Procedures,Triggers,我有两个不同的SQL 2008服务器,我没有在其中任何一个服务器中创建链接服务器的权限。 我在server1.table1上创建了一个触发器,使用OPENROWSET将相同的记录插入远程服务器server2.table1 我创建了一个存储过程来插入此记录,执行该存储过程时没有问题。它将记录的数据插入远程服务器 问题是,当我从触发器调用存储过程时,会收到一条错误消息 有人能帮我解决这个问题吗 存储过程: 触发: 当我尝试在表中插入新的描述值时,收到以下错误消息: 有人能帮忙吗 谢谢我想你把这件事复

我有两个不同的SQL 2008服务器,我没有在其中任何一个服务器中创建链接服务器的权限。 我在server1.table1上创建了一个触发器,使用OPENROWSET将相同的记录插入远程服务器server2.table1

我创建了一个存储过程来插入此记录,执行该存储过程时没有问题。它将记录的数据插入远程服务器

问题是,当我从触发器调用存储过程时,会收到一条错误消息

有人能帮我解决这个问题吗

存储过程: 触发: 当我尝试在表中插入新的描述值时,收到以下错误消息: 有人能帮忙吗
谢谢

我想你把这件事复杂化了。这里确实不需要存储过程来执行此操作。您可以使用一个简单的insert语句直接在触发器中插入到另一个数据库中。这消除了大量的复杂性,而且是基于集合的

ALTER TRIGGER [dbo].[InsertTable1]
   ON  [DB1].[dbo].[Table_1] 
   for insert
AS 

BEGIN
    SET NOCOUNT ON;

    INSERT INTO RemoteDB].[dbo].[Table_1](Description)
    Select i.Descr 
    from INSERTED i;
END

你的扳机有重大缺陷。它假定只插入一行。您需要编写触发器来处理数据集。在本例中,这很可能意味着修改InsertIntoRemoteTable过程以接收表值参数而不是标量值。至于错误消息…你有没有试着研究它?搜索错误消息提供了成千上万的链接来解释该消息以及如何修复它。我真的没有仔细查看您的过程。这里的参数有什么意义?您传入它,然后在末尾选择它。另一个有趣的部分是,您只需将表_1中的所有行插入远程表。这将在wazoo中产生重复,因为它只是不断地重复插入相同的行。我认为您需要分析您的流程,并确定您在这里尝试执行的操作。参数是新插入的字段值,因此当新记录插入到表1中时,触发器将调用该过程并发送字段值以将这些值插入到远程表中,但请查看insert语句。它不仅仅得到那一行,它还得到表1中的所有行。老实说,我根本不知道你为什么在这里使用OPENROWSET。为什么不直接在触发器中插入一个简单的命令呢?我不是插入所有的行,我只是尝试插入新插入的记录。谢谢你的代码,如果我链接了服务器,你的代码就可以工作了。我确实没有创建新链接服务器的权限,这就是为什么我在运行时使用OPENROWSET发送服务器、用户ID和密码。再次感谢您的帮助还有一件事,我能够执行过程并对参数进行路径设置,并且记录成功插入到远程表中。唯一的一件事是,当我从触发器调用它时,我得到了这个消息,但是当你从触发器调用时,你将得到表1中的所有行,除非你添加where子句。正如我之前所说的,搜索您的确切消息,您将获得数千次的答案。不,我只从“插入”中获取插入值,选择@Desc=I。从插入的I中删除;如果我错了,请纠正我不。查看您的insert查询。“从[RemoteDB].[dbo].[Table_1]中选择描述”,您需要向其中添加where子句。
    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).
ALTER TRIGGER [dbo].[InsertTable1]
   ON  [DB1].[dbo].[Table_1] 
   for insert
AS 

BEGIN
    SET NOCOUNT ON;

    INSERT INTO RemoteDB].[dbo].[Table_1](Description)
    Select i.Descr 
    from INSERTED i;
END