【问题标题】: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 工作..