【问题标题】:Records not replicated when inserted by custom replication stored procedure由自定义复制存储过程插入时未复制的记录
【发布时间】:2008-10-11 13:40:09
【问题描述】:

我最近刚刚为我的订阅者数据库设置了自定义复制,如another post here 中所述。基本上,当发布者向订阅者推送一条新记录时,存储过程也会将复制时间插入到表中的额外列中,并将新记录插入到日志表中。

我在尝试将日志表复制回主发布数据库时出现问题。这就是我所做的:

  1. 在日志表所在的数据库中,我设置了一个新的事务复制,并将其设置为创建快照。
  2. 创建发布后,我会创建一个新的推送订阅,并将其设置为立即初始化。
  3. 订阅创建后,我检查了同步状态,确认快照应用成功。

现在是奇怪的部分:如果我使用 SQL Server Management Studio 手动将记录添加到日志表,该记录将被很好地复制。如果记录是由自定义复制存储过程添加的,则不会。状态将始终显示“没有可用的复制交易”。

我不知道出版物为什么会这样:我真的不明白它如何以不同的方式处理自定义复制存储过程插入的数据。

谁能解释我做错了什么?

更新:几个月前我终于有了这个问题的答案,只是我从来没有时间更新这个问题。我们必须记录给 Microsoft 的支持电话,但我们得到了一个可行的解决方案。


回答:要解决此问题,在添加订阅时, 您需要运行如下脚本:
sp_addsubscription @publication = 'TEST', ..., @loopback_detection = 'false'

解决方案的关键是上面显示的最后一个参数。默认情况下,生成的订阅脚本不会有这个参数。

【问题讨论】:

    标签: sql-server sql-server-2005 replication


    【解决方案1】:

    几个月前我终于有了这个问题的答案,只是我一直没有时间更新这个问题。我们必须记录给 Microsoft 的支持电话,但我们得到了一个可行的解决方案。

    要解决此问题,添加订阅时,您需要运行如下脚本:

    sp_addsubscription @publication = 'TEST', ..., @loopback_detection = 'false'
    

    解决方案的关键是上面显示的最后一个参数:@loopback_detection = 'false'。默认情况下,生成的订阅脚本不会有这个参数。

    【讨论】:

      【解决方案2】:

      我知道这是一个非常古老的问题,所以你可能已经解决了这个问题,但无论如何......

      您所描述的问题似乎毫无意义。通过复制触发器对源表的任何更改都将进一步调用复制。在您的流程描述中唯一看起来不正确的事情(尽管我可能误读了)是您在推送订阅之前创建了一个快照。通常,您应该设置复制、推送订阅,然后创建/推送快照。不要相信同步状态,因为它没有检查任何东西,它只是说它没有要复制的事务,它不知道表已同步。

      至于为什么您的手动插入有效,而不是自动插入,我会检查并重新检查您的工作,从根本上说,如果复制工作正常,那么无论来源如何,都会复制对该表的任何更改。

      如果您早就解决了这个问题,我很想听听解决方案。

      编辑:

      一个迟来的想法:当您使用自定义 proc 更新日期时间字段,然后将触发器触发回复制数据库时,您可能会导致复制模型和插入之间出现死锁问题。这可能会导致无法复制回来。在不运行测试的情况下弄清楚有点复杂,但这是有可能的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多