Sql不会将查询排入链接服务器

时间:2013-08-20 05:02:55

标签: mysql sql sql-server linked-server

我在sql server中有一个表,在mysql服务器中有一个名称和字段相同的表。我使用以下触发器将它们连接到链接服务器:

CREATE TRIGGER items_insert ON [prueba]
FOR INSERT
AS
BEGIN
declare @tmp table (a int, b varchar(10))
insert @tmp (a, b) select ID, Name from inserted
COMMIT
SET XACT_ABORT ON
INSERT INTO OPENQUERY(WEBDB, 'SELECT * FROM prueba')
SELECT a, b FROM @tmp
begin tran
end

我的问题是,当我离开mysql serverm并在sql server中插入一条记录时,它显然不会插入mysql中,但是当我把mysql服务器放入时它也没有。我想要一个排序队列,以便当服务器之间的连接丢失时,在恢复连接时,在此期间的任何新记录都插入到mysql中。我怎么能实现这个?,我是sql server和触发器的新手

注意:根据this教程,触发器具有@tmp声明,因为我收到有关事务错误的奇怪错误

1 个答案:

答案 0 :(得分:2)

触发器永远不会排队,并且在触发器内使用链接服务器是a bad idea。你会发现有数百人用我的手指烧着他们的手指。

对于任何队列类型系统,您需要实现服务代理,或者Nilesh指出使用对表进行排队的作业。

您当前的设置将会出现问题,因为几年前我使用相同的方法尝试将数据从SQL2005传输到MySQL服务器。在SQL2000中偶然可以将数据从MSSQL复制到任何其他ODBC数据源。 Microsoft在SQL2005中停止了这一点。

所以你在这里有两个选择。

  1. 学习Service Broker:服务代理是一个很棒但很少使用的SQL。它是一种异步排队技术,允许您向其他远程系统发送消息,检查this链接以获取更多信息。然而,这需要花费时间和精力来实现,因为你必须学习安静,即陡峭的学习曲线。
  2. 按计划创建队列表并处理。创建一个表,其中包含要使用已处理标志插入MySQL的数据。在触发器中将此数据插入表中。创建一个每分钟运行一次的SQL服务器作业,并将排队表中的数据插入MySQL数据库。成功插入后,将其标记为已处理。
  3. 将处理过的标志添加到原始表中。创建一个使用该表的作业来获取尚未插入的所有项目并按计划插入它们。这与选项2类似,但您不会创建其他表格。