合并复制期间违反PRIMARY KEY约束

时间:2015-06-26 15:10:25

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

我有两个相同的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'
  • 在单个表格上配置合并复制'国家'。

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

enter image description here

表结构如下:

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表的订阅属性和文章属性显示在以下屏幕截图中

enter image description here

enter image description here

我试图找到此错误的解决方案,但没有任何帮助。我必须说清楚我不是DBA,而且它是我第一次在SQL Server上进行复制。我真的很感激任何帮助。

1 个答案:

答案 0 :(得分:2)

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

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