冲突查看器向我显示下一条消息:
'_publisher_server_'处的行插入无法传播到'_subscriber_server_'。这种失败可能是由违反约束引起的。违反PRIMARY KEY约束'PK_ PartPlan _FD9D7F927172C0B5'。无法在对象'_table_name _'中插入重复键。
谢谢。
答案 0 :(得分:1)
这不是一个简单的解决方案(因为您可能已经使用自动递增int
键设计了数据库),但使用GUID(“uniqueidentifier”)作为主键将解决您的PK碰撞问题
答案 1 :(得分:0)
您是否尝试WHEN MATCHED THEN
和WHEN 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的