【问题标题】:Violation of PRIMARY KEY constraint during Merge Replication合并复制期间违反 PRIMARY KEY 约束
【发布时间】:2015-06-26 15:10:24
【问题描述】:

我有两个相同的 SQL Server 2005 数据库(MYDB_Pub、MYDB_Sub1),其中配置了合并复制并且工作正常。

最近我们升级到 SQL Server 2014。为了测试新 SQL Server 上的复制功能,我按照以下步骤操作:

  • 在 SQL Server 2005 上备份 MYDB_Pub。
  • 在 SQL Server 2014 上恢复同名的 MYDB_Pub。
  • 在 SQL Server 2014 上恢复同名的 MYDB_Pub 'MYDB_Sub1'。
  • 在单个表“国家/地区”上配置合并复制。

现在,当我运行复制过程时,我收到以下错误消息:

表结构如下:

CREATE TABLE [dbo].[Country](
    [CountryId] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
    [Code] [char](2) NOT NULL,  
    [CountryName] [varchar](50) NOT NULL,   
    [rowguid] [uniqueidentifier] ROWGUIDCOL  NOT NULL CONSTRAINT [DF_Country_rowguid]  DEFAULT (newsequentialid()) 
)
GO
ALTER TABLE [dbo].[Country]  WITH NOCHECK ADD  CONSTRAINT [repl_identity_range_BEB70305_9154_4BBE_B898_61681A047BA2] CHECK NOT FOR REPLICATION (([CountryId]>(112251) AND [CountryId]<=(113251) OR [CountryId]>(113251) AND [CountryId]<=(114251)))
GO
ALTER TABLE [dbo].[Country] CHECK CONSTRAINT [repl_identity_range_BEB70305_9154_4BBE_B898_61681A047BA2]
GO

请注意,在定义复制之前,[rowguid] 列已经存在于数据库中。发布者和订阅者中的Country 表具有相似的数据,因为发布者和订阅者是从同一个文件中恢复的。

为了配置复制,我使用了this 文章中提供的说明。

Country 表的订阅属性和文章属性如下图所示

我试图找到解决此错误的方法,但没有任何帮助。我必须明确说明我不是 DBA,这是我第一次在 SQL Server 上玩复制。非常感谢任何帮助。

【问题讨论】:

    标签: sql-server sql-server-2014 merge-replication


    【解决方案1】:

    您收到错误的原因是该表已存在于订阅服务器上,并且已填充,并且初始化尝试使用来自发布者的数据重新填充该表。这样做是因为您的文章属性显示“如果名称正在使用中的操作 = 保持现有对象不变”。我相信默认是“删除表并重新创建对象”或类似的东西,这意味着当您同步初始化时,它将在订阅者处删除表,然后填充它。这将避免上述错误,因为订阅者的表在填充之前将是空的。

    因此,您需要决定,是否需要订阅者的现有数据,或者是否在初始化期间,您可以让合并复制删除对象,然后根据发布者的快照重新填充它。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    相关资源
    最近更新 更多