【问题标题】:Sql does not queue queries to linked serverSql 不对链接服务器的查询进行排队
【发布时间】:2013-08-22 01:07:08
【问题描述】:

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

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 server 时它也没有。我想要一个队列,这样当服务器之间的连接断开时,在连接恢复时,这段时间内的任何新记录都会插入到 mysql 中。我怎么能做到这一点?,我是 sql server 和触发器的新手

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

【问题讨论】:

  • 我建议有一个 SQL Server 作业,它可以及时运行并获取记录并推送到 mysql 数据库。您可能需要使用 SQL Server 表中的某个布尔列来跟踪推送了哪些记录。

标签: mysql sql sql-server linked-server


【解决方案1】:

触发器永远不会排队,在触发器内使用链接服务器是a bad idea。你会发现数百人用我做过的这个烫伤了他们的手指。

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 2015-02-20
    • 1970-01-01
    相关资源
    最近更新 更多