1

i have a table in sql server and a table with the same name and fields in mysql server. i connected them trhough a linked server using the following trigger:

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

my problem is that when i take offline the mysql serverm and i insert a record in sql server, it obviously does not insert in mysql, but when i put the mysql server it does not either. i want a queue of sorts, so that when the connection between servers drop, any new records during that time are inserted in mysql when the connection is restored. How could i achieve this?, i am new to sql server and triggers

NOTE: the trigger has the @tmp declarations according to this tutorial because i was getting a weird error about transactional errors

4

1 回答 1

2

触发器永远不会排队,并且在触发器内使用链接服务器是个坏主意。你会发现成百上千的人用我做过的这个来烫手指。

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

您当前的设置将非常有问题,因为几年前我使用相同的方法试图将数据从 SQL2005 获取到 MySQL 服务器。在 SQL2000 中,您实际上可以将数据从 MSSQL 复制到任何其他 ODBC 数据源。Microsoft 在 SQL2005 中停止了此功能。

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

  1. 学习 Service Broker:Service Broker 是一个很棒但很少使用的 SQL。它是一种异步排队技术,允许您将消息发送到其他远程系统,请查看链接以获取更多信息。然而,这将需要时间和精力来实施,因为您将不得不学习安静一点,即陡峭的学习曲线。
  2. 创建一个队列表并按计划处理。创建一个表,其中包含要插入 MySQL 的数据,并带有已处理的标志。在触发器中将此数据插入表中。创建一个每分钟运行一次的 SQL Server 作业,并将队列表中的数据插入 MySQL 数据库。成功插入后将其标记为已处理。
  3. 将已处理标志添加到原始表。创建一个使用该表的作业来获取所有尚未插入的项目并按计划插入它们。这类似于选项 2,但您不创建额外的表。
于 2013-08-20T07:12:10.097 回答