【问题标题】:Adding insert into linked server inside a trigger在触发器内将插入添加到链接服务器
【发布时间】:2016-04-11 11:39:59
【问题描述】:

我正在尝试运行一个触发器,该触发器允许我将本地表上的插入数据插入到链接服务器的表中。这就是我所做的:

use [medb]

ALTER TRIGGER [dbo].[trigger1] ON [dbo].[tbl1]
AFTER INSERT
AS
BEGIN

    INSERT into openquery(DEV, 'tbl_remotetbl') select * from inserted
        END

但它给出了这个错误:

无法处理对象“tbl_remotetbl”。 OLE DB 提供程序 链接服务器“DEV”的“MSDASQL”表示对象具有 没有列或当前用户对此没有权限 对象。

我的问题似乎是什么? 注意:我使用的是 SQL Server 2008 R2

【问题讨论】:

    标签: sql-server sql-insert linked-server


    【解决方案1】:

    您是否尝试在触发器之外运行命令?它起作用了吗? 这是我在我的 openquery 中使用的语法:

    INSERT INTO OPENQUERY(LinkedServer_Name,
    'select remote_field_1,remote_field_2 from remote_Schema.remote_table')
    select local_column1,local_column2
    FROM local_Table 
    

    现在,话虽如此,让这个语句在内部成为一个触发器,这是我做不到的。上面的语句在由它自己执行时完美地工作。但是一旦将其放入触发器中,与该触发器相关的整个事务就会失败。我的意思是即使是触发触发器的插入语句也不会通过,主表也不会插入本应插入其中的数据。

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题,并花了很多时间试图弄清楚如何使 openquery 语句在更新/插入/删除触发器中工作,但没有成功....

      所以,这是一个替代解决方案,也许这可以解决您的问题,这是在我需要将数据从 MSSQL 传递到 MySQL 数据库的情况下。

      首先,创建一个保存表,以便您可以存储插入到表中的临时信息,该表将只保存我需要传递给 MySQL 的数据

      create table holding_table (ID int, value2 int)
      

      trigger 会将数据插入到保存表中,而不是直接发送到 MySQL

      ALTER TRIGGER [dbo].[temp_data_to_mysql] 
      ON [dbo].[source_table] 
      FOR insert
       AS
       BEGIN
      
          INSERT into holding_table (ID,Stock)select a, b from inserted
      
          END
        GO 
      

      之后,您可以在 SQL Server 代理中创建一个任务,这样它就可以每 N 分钟执行一次您的存储过程。

      希望它有所帮助,我知道这是一种解决方法,但经过一些调查和测试后,我无法在触发过程中调用 openquery 工作..

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-03
        • 1970-01-01
        • 2010-09-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多