【问题标题】:Automatically resolve primary key merge conflict自动解决主键合并冲突
【发布时间】:2011-08-23 06:32:04
【问题描述】:

你能建议我自动解决的方法吗 发布者和订阅者合并期间的主键冲突。似乎 Sql Server 并没有开箱即用:(。

冲突查看器显示下一条消息:

“_publisher_server_”处的行插入无法传播到“_subscriber_server_”。此失败可能是由违反约束引起的。违反主键约束“PK_PartPlan_FD9D7F927172C0B5”。无法在对象“_table_name_”中插入重复键。

谢谢。

【问题讨论】:

    标签: sql sql-server-2008 replication merge-conflict-resolution


    【解决方案1】:

    我使用自动编号 PK 解决此问题的最简单方法是将自动编号增量从 1 更改为 10(或 100 或 1000,无论需要什么),然后为所有参与者设置不同的种子。

    所以,我可以开始种子:
    DB1 在 1
    DB2 在 2
    DB3 在 3 ...
    DBn 在 n (n

    例如: 100 的增量将产生 DB 的 PK:
    DB1:** 101、201、301...
    DB2:** 102、202、302...
    DB3:** 103、203、303...
    无论INSERTed 有多少行,它们总是有唯一的 PK,因为最后的数字反映了特定的数据库。

    此方法可以根据您的订阅者数量进行调整,它们永远不会发生冲突,而且您还可以通过代理键知道原点。

    对于现有表,只需通过脚本重置 PK 种子和间隔。这应该很容易做到。


    可以使用 GUIDE PK,但使用 GUID 作为主键可能会有很大问题,特别是如果您不将其从聚集索引中删除。 它们也更大,并且您可能已经拥有取决于整数的代码。

    当您创建合并复制时,SQL Server 会自动创建用于跟踪更改的 GUID,但这并不意味着它们必须是 PK 的

    【讨论】:

      【解决方案2】:

      您是否尝试过 WHEN MATCHED THENWHEN NOT MATCHED BY TARGET THEN 进行 UPSERT(条件更新或插入)?

      可以在here找到文档。

      我假设主键代表两个数据库中的相同项目。

      【讨论】:

      • 嗯,我没有好的经验。与复制。当出现 PK 冲突时,我可以以某种方式运行上面的代码吗?如果我可以编写某种可以处理此类冲突的自动解析器,那就太好了(T-SQL 或 C#)。我知道自定义解析器,但他们能处理这个冲突吗?也许以前有人这样做过?
      • 也许msdn.microsoft.com/en-us/library/ms147911.aspx ?然后你可以实现InsertErrorHandler
      【解决方案3】:

      这不是一个简单的解决方案(因为您可能已经设计了具有自动递增 int 键的数据库),但是为您的主键使用 GUID(“唯一标识符”)将解决您的 PK 冲突问题。

      【讨论】:

      • 或者,更好的是,选择一个根据定义唯一的主键。
      • 由于历史原因不能这样做:(
      • @Vladislav:“自然”主键在存在时很好,但根据我的经验,它们非常罕见(而且通常看起来像理想自然键的东西最终都会有重复,比如社会保障数字,例如)。
      • @user68923:如果您不能使用 GUID,那么您需要在订阅者上设置身份范围。身份范围确保每个订户添加具有整个系统唯一的 PK 值的新记录。见:msdn.microsoft.com/en-us/library/ms146907.aspx
      • 您唯一真正替代 GUID 和身份范围的方法是以编程方式处理冲突查看器消息,为冲突的记录重新分配 PK 值,然后重新同步。但相信我,你真的不想做那种事。
      猜你喜欢
      • 2019-08-26
      • 1970-01-01
      • 1970-01-01
      • 2014-09-17
      • 2012-03-01
      • 1970-01-01
      • 2015-10-15
      • 2015-06-24
      • 2014-09-13
      相关资源
      最近更新 更多