您能否建议我在发布者和订阅者合并期间自动解决主键冲突的方法。似乎 Sql Server 并没有开箱即用:(。
冲突查看器向我显示下一条消息:
无法将“_publisher_server_”处的行插入传播到“_subscriber_server_”。此失败可能是由违反约束引起的。违反主键约束“PK_ PartPlan _FD9D7F927172C0B5”。无法在对象“_table_name_”中插入重复键。
谢谢你。
您能否建议我在发布者和订阅者合并期间自动解决主键冲突的方法。似乎 Sql Server 并没有开箱即用:(。
冲突查看器向我显示下一条消息:
无法将“_publisher_server_”处的行插入传播到“_subscriber_server_”。此失败可能是由违反约束引起的。违反主键约束“PK_ PartPlan _FD9D7F927172C0B5”。无法在对象“_table_name_”中插入重复键。
谢谢你。
这不是一个简单的解决方案(因为您可能已经使用自动递增int
键设计了数据库),但是使用 GUID(“唯一标识符”)作为主键将解决您的 PK 冲突问题。
您是否尝试过WHEN MATCHED THEN
执行WHEN NOT MATCHED BY TARGET THEN
UPSERT(条件更新或插入)?
文档可以在这里找到。
我假设主键代表两个数据库中的相同项目。
我使用自动编号 PK 解决此问题的最简单方法是将自动编号增量从 1 更改为 10(或 100 或 1000,无论需要什么),然后在所有参与者上设置不同的种子。
所以,我可以开始播种:
DB1 at 1
DB2 at 2
DB3 at 3
...
DBn at n (n < increment)
例如:增量 100 将产生 DB 的 PK:
DB1 : ** 101, 201, 301...
DB2 : ** 102, 202, 302...
DB3 : ** 103, 203, 303...
否无论编辑多少行,INSERT
它们都将始终具有唯一的 PK,因为最终数字反映了特定的数据库。
此方法可以根据您的订阅者数量进行调整,它们永远不会发生冲突,并且您还可以获得额外的好处,即知道刚刚给定代理键的来源点。
对于现有表,只需通过脚本重置 PK 种子和间隔。这应该很容易做到。
您可以使用 GUIDE PK,但使用 GUID 作为主键可能会有很大问题,特别是如果您不将其从聚集索引中删除。它们也更大,您可能已经有了取决于整数的代码。
创建合并复制时,SQL Server 会自动创建用于跟踪更改的 GUID,但这并不意味着它们必须是 PK 的