由自定义复制存储过程插入时未复制的记录

时间:2008-10-11 13:40:10

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

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

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

  1. 在日志表所在的数据库中,我设置了一个新的事务复制,并将其设置为创建快照。
  2. 创建发布后,我创建一个新的推送订阅,并将其设置为立即初始化。
  3. 创建订阅后,我检查了同步状态并确认快照已成功应用。
  4. 现在这里有一个奇怪的部分:如果我使用SQL Server Management Studio手动将记录添加到日志表中,则记录将被正确复制。如果记录是由自定义复制存储过程添加的,则不会。状态将始终显示“没有可用的复制事务”。

    我不知道为什么发布会以这种方式表现:我真的不知道它是如何以不同方式处理自定义复制存储过程插入的数据的。

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

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

    <小时/> 答案:要解决此问题,请在添加订阅时 你需要运行如下脚本:

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

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

2 个答案:

答案 0 :(得分:1)

几个月前我终于找到了这个问题的答案,只是因为我从未解决过这个问题。我们必须记录对Microsoft的支持电话,但我们得到了一个可行的解决方案。

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

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

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

答案 1 :(得分:0)

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

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

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

如果你早已解决了这个问题,我很想听听这个决议。

编辑:

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