我尝试运行一个触发器,允许我将本地表中插入的数据插入到链接服务器的表中。这就是我所做的:
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
答案 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工作。