在同步 b/w 两个 sql server 2005 db 时解决标识列主键冲突

Posted

技术标签:

【中文标题】在同步 b/w 两个 sql server 2005 db 时解决标识列主键冲突【英文标题】:Resolve Identity column primary key conflict while sync b/w two sql server 2005 db 【发布时间】:2012-07-15 12:10:43 【问题描述】:

我有两个 sql server 2005 数据库 - ParentDBChildDB,我想使用同步框架 2.1 同步它们ParentDB 在服务器上,ChildDB 在客户端 m/c 上。 ParentDB 中有很多表,但ChildDB 上的表很少,可以说,Customer 表在两个数据库之间很常见,Id (column) 作为主键设置为自动递增,我想同步这个表,我我正在使用以下 msdn example 中给出的方法。这种方法有效,除非我只从服务器下载或上传到服务器。

让我们来看一个场景: 1.服务器表有一行Id=52 2. 两个数据库同步 3. 现在在ParentDBin Customer table 上插入一行 Id=53 4. 同时在Customer 表的ChildDB 上插入另一行,ID=53(因为两个表都有自动增量) 现在,当我同步两个表时,两行中的任何一个都会被覆盖,具体取决于同步的方向。 我想要的是调整Id,并保留两行,

我应该怎么做才能解决这种冲突,如果可能,请提供伪代码。 附言: 我希望当我们考虑外键约束时,场景会变得更加复杂。 提前谢谢

【问题讨论】:

【参考方案1】:

不建议在同步环境中使用 Identity 列作为 PK(甚至不使用 Sync Framework)(参见Selecting an Appropriate Primary Key for a Distributed Environment,原因与您已经发现的相同。

如果您可以更改架构,我建议您使用不同的 PK(Guid 或 Int + ClientId)

【讨论】:

以上是关于在同步 b/w 两个 sql server 2005 db 时解决标识列主键冲突的主要内容,如果未能解决你的问题,请参考以下文章

使用Red Gate Sql Compare 数据库同步工具进行SQL Server的两个数据库的结构比较同步

SQL Server - 同步两个数据库

怎样实现两个异地SQL SERVER数据库的实时同步

如何在 Linux 上跨可用性组副本同步 SQL Server 代理作业?

SQL Server 跨库同步数据

SQL Server 跨库同步数据