自动解决主键合并冲突

时间:2011-05-11 12:17:17

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

你可以建议我自动解决的方式吗? 发布服务器和订阅服务器之间合并期间的主键冲突。似乎Sql Server没有开箱即用:(。

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

  

'_publisher_server_'处的行插入无法传播到'_subscriber_server_'。这种失败可能是由违反约束引起的。违反PRIMARY KEY约束'PK_ PartPlan _FD9D7F927172C0B5'。无法在对象'_table_name _'中插入重复键。

谢谢。

3 个答案:

答案 0 :(得分:1)

这不是一个简单的解决方案(因为您可能已经使用自动递增int键设计了数据库),但使用GUID(“uniqueidentifier”)作为主键将解决您的PK碰撞问题

答案 1 :(得分:0)

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

可以找到文档here

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

答案 2 :(得分:0)

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

所以,我可以开始种子:
DB1 ,1 2> DB2 DB3 3岁 ...
DBn 在n(n <增量)

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

此方法可以根据您的订阅者数量进行调整,它们永远不会发生冲突,并且您可以通过了解代理密钥来了解原点。

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


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

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