2

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

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

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

谢谢你。

4

3 回答 3

1

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

于 2011-05-11T12:21:08.047 回答
1

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

文档可以在这里找到。

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

于 2011-05-11T12:34:23.537 回答
0

我使用自动编号 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 的

于 2011-05-11T17:33:42.020 回答