1

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

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

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

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

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

有人可以解释我做错了什么吗?

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


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

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

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

4

2 回答 2

1

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

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

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

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

于 2009-03-16T10:03:44.053 回答
0

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

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

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

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

编辑:

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

于 2009-02-09T12:34:24.533 回答