将insert添加到触发器内的链接服务器中

时间:2015-03-26 08:44:46

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

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

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提供程序   " MSDASQL"对于链接服务器" DEV"表示该对象具有   没有列或当前用户没有权限   对象

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

2 个答案:

答案 0 :(得分:0)

您是否尝试在触发器外运行命令?它有用吗? 这是我在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 

现在,说到这一点,让这个语句在内部作为触发器,是我无法做到的。上面的陈述在被自己执行时完美地完成。但是一旦将其置于触发器中,与该触发器相关的整个事务就会失败。我的意思是即使触发触发器的insert语句也没有通过,主表也没有插入要插入其中的数据。

答案 1 :(得分:0)

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

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

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

create table holding_table (ID int, value2 int)

触发器将数据插入到保持表中,而不是直接发送到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工作。