代码之家  ›  专栏  ›  技术社区  ›  alextansc

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

  •  1
  • alextansc  · 技术社区  · 16 年前

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

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

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

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

    我不知道发布为什么会这样做:我真的不知道它是如何处理由自定义复制存储过程插入的数据的。

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

    更新: 几个月前,我终于找到了这个问题的答案,只是我从来没有机会更新这个问题。我们必须给微软打一个支持电话,但我们有一个可行的解决方案。


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

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

    2 回复  |  直到 16 年前
        1
  •  1
  •   alextansc    16 年前

    几个月前,我终于找到了这个问题的答案,只是我从来没有机会更新这个问题。我们必须给微软打一个支持电话,但我们有一个可行的解决方案。

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

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

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

        2
  •  0
  •   Timbo    16 年前

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

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

    至于手动插入的工作原理,而不是自动插入的工作原理,我会检查并重新检查您的工作原理,从根本上讲,如果复制工作正常,则不管源代码是什么,都会复制对此表所做的任何更改。

    如果你早就解决了这个问题,我很有兴趣听听这个解决方案。

    编辑:

    最近的一个想法是:当您使用自定义过程更新日期时间字段,然后将触发器激发回复制数据库时,可能会导致复制模型和插入之间出现死锁问题。这可能导致复制失败。不运行测试就有点复杂,但这是可能的。