【问题标题】:Trigger fire on each inserted row to insert into remote Table在每个插入的行上触发触发以插入远程表
【发布时间】: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


【解决方案1】:

我认为您对此过于复杂了。这里实际上不需要存储过程来执行此操作。您可以使用简单的插入语句直接在触发器中插入另一个数据库。这消除了大量的复杂性,并且是基于集合的。

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

【讨论】:

  • 感谢您的代码,如果我有链接服务器,您的代码可以工作。而且我真的没有创建新链接服务器的权限,这就是为什么我使用 OPENROWSET 在运行时发送服务器、用户 ID 和密码的原因。再次感谢您的帮助
  • 还有一件事,我能够执行过程和路径参数,并且记录成功插入到远程表中。唯一的,当我从触发器调用它时,我收到了这条消息
  • 但是当您从触发器调用时,您将从 Table_1 中获取所有行,除非您添加 where 子句。正如我之前所说,搜索您的 EXACT 消息,您将看到成千上万次的答案。
  • 不,我只从“插入”中获取插入的值 从插入的 i 中选择 @Desc = i.Descr;如果我错了,请纠正我
  • 没有。查看您的插入查询。 “SELECT Description FROM [RemoteDB].[dbo].[Table_1]”,你需要在其中添加一个where子句。
猜你喜欢
  • 2013-09-30
  • 2015-07-07
  • 1970-01-01
  • 2011-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-10
  • 2012-03-30
相关资源
最近更新 更多