合并复制期间违反 PRIMARY KEY 约束
Violation of PRIMARY KEY constraint during Merge Replication
我有两个相同的 SQL Server 2005 数据库(MYDB_Pub、MYDB_Sub1),其中配置了合并复制并且工作正常。
最近我们升级到 SQL Server 2014。为了在新的 SQL 服务器上测试复制功能,我执行了以下步骤:
- 在 SQL Server 2005 上备份 MYDB_Pub。
- 在 SQL Server 2014 上用同名恢复 MYDB_Pub。
- 在 SQL Server 2014 上使用名称恢复相同的 MYDB_Pub
'MYDB_Sub1'.
- 在单个 table 'Country'.
上配置合并复制
现在当我 运行 复制过程时,我收到以下错误消息:
table结构如下:
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
table 发布者和订阅者中的数据相似,因为发布者和订阅者是从同一文件恢复的。
为了配置复制,我使用了 this 文章中提供的说明。
Country
table 的订阅属性和文章属性显示在下面的屏幕截图中
我试图找到解决此错误的方法,但没有任何帮助。我必须明确表示我不是 DBA,这是我第一次在 SQL 服务器上玩复制。如果有任何帮助,我将不胜感激。
您收到错误的原因是 table 已经存在于订阅者上,并且已填充,并且初始化正在尝试使用来自的数据重新填充 table出版商。它这样做是因为您的文章 属性 说 "Action if name is in use = Keep existing object unchanged"。我相信默认值是 "drop table and recreate object" 或类似的东西,这意味着当您同步初始化时,它会在订阅者处删除 table,然后填充它。这将避免上述错误,因为订阅者的 table 在填充之前将是空的。
所以你需要决定,如果你需要订阅者的现有数据,或者如果在初始化期间,你可以让合并复制删除对象,并根据发布者的快照重新填充它。
我有两个相同的 SQL Server 2005 数据库(MYDB_Pub、MYDB_Sub1),其中配置了合并复制并且工作正常。
最近我们升级到 SQL Server 2014。为了在新的 SQL 服务器上测试复制功能,我执行了以下步骤:
- 在 SQL Server 2005 上备份 MYDB_Pub。
- 在 SQL Server 2014 上用同名恢复 MYDB_Pub。
- 在 SQL Server 2014 上使用名称恢复相同的 MYDB_Pub 'MYDB_Sub1'.
- 在单个 table 'Country'. 上配置合并复制
现在当我 运行 复制过程时,我收到以下错误消息:
table结构如下:
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
table 发布者和订阅者中的数据相似,因为发布者和订阅者是从同一文件恢复的。
为了配置复制,我使用了 this 文章中提供的说明。
Country
table 的订阅属性和文章属性显示在下面的屏幕截图中
我试图找到解决此错误的方法,但没有任何帮助。我必须明确表示我不是 DBA,这是我第一次在 SQL 服务器上玩复制。如果有任何帮助,我将不胜感激。
您收到错误的原因是 table 已经存在于订阅者上,并且已填充,并且初始化正在尝试使用来自的数据重新填充 table出版商。它这样做是因为您的文章 属性 说 "Action if name is in use = Keep existing object unchanged"。我相信默认值是 "drop table and recreate object" 或类似的东西,这意味着当您同步初始化时,它会在订阅者处删除 table,然后填充它。这将避免上述错误,因为订阅者的 table 在填充之前将是空的。
所以你需要决定,如果你需要订阅者的现有数据,或者如果在初始化期间,你可以让合并复制删除对象,并根据发布者的快照重新填充它。