2013-08-20 35 views
1

我有一个表在sql服务器和一个表中有相同的名称和字段在MySQL服务器。我使用以下触发连接它们trhough链接服务器:Sql不排队查询到链接的服务器

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教程,因为我是获取有关事务的错误

+0

我会建议有一个及时运行的SQL Server作业,并拿起记录,并推送到MySQL数据库。您可能需要跟踪SQL Server表中某些布尔列所推送的记录。 – Nilesh

回答

2

触发器将永远不会排队一个奇怪的错误有@tmp声明并在触发器内使用链接的服务器是a bad idea。你会发现有数百人用我这样做过的一个人的手指燃烧他们的手指。

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

您目前的设置将会非常成问题,因为我在几年前使用相同的方法试图从SQL2005获取数据到MySQL服务器。偶尔在SQL2000中,您实际上可以将数据从MSSQL复制到任何其他ODBC数据源。微软在SQL2005中停止了这一点。

所以你有两个选择。

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