合并复制唯一键约束

时间:2015-10-13 15:12:53

标签: sql-server replication merge-replication

我在两台服务器上安装了SQL Server Merge Replication,并且在同步运行时出现了一个键约束错误。我可以解决此问题的唯一方法是删除其中一个服务器上的记录,然后运行同步。

问题:有没有办法配置复制或解析程序,以便发布者记录获胜,并在遇到唯一或主要密钥冲突时自动删除订阅者记录?

样本表:

CREATE TABLE [dbo].[tblPeople](
  [ID] [bigint] IDENTITY(1,1) NOT NULL,
  [col1] [int] NULL,
  [col2] [int] NULL,
  [col3] [int] NULL,
  [name] [varchar](52) NULL 
CONSTRAINT [UK_keys] UNIQUE NONCLUSTERED 
(
  [col1] ASC,
  [col2] ASC,
  [col3] ASC
)

在服务器1上插入

INSERT into tblPeople (col1, col2, col3, name) values (1, 1, 1, 'Server 1 Insert')

在服务器2上插入

INSERT into tblPeople (col1, col2, col3, name) values (1, 1, 1, 'Server 2 Insert')

触发同步,导致此冲突错误,并且两个服务器都拥有自己的此记录版本。

'SERVER1.TestDb'处的行插入无法传播到'SERVER2.TestDb'。这种失败可能是由违反约束引起的。违反UNIQUE KEY约束'UK_keys'。无法在对象'dbo.tblPeople'中插入重复键。重复键值为(1,1,1)。

我读到的关于此的一切建议添加一个独特的guid或使用标识列,这不是解决此问题的方法。身份范围工作得很好,我甚至可以创建自己的rowguid,但仍然无法解决约束违规,我最终需要手动删除记录。

这个人提出了类似的问题,但我需要在指南和身份之上的唯一密钥。 Automatically resolve primary key merge conflict

1 个答案:

答案 0 :(得分:0)

通过在合并文章中将 compensate_for_errors 设置为true来解决此问题。默认情况下,SQL Server在发生约束错误时不会触发解析程序。您无法通过用户界面更改此设置,必须使用t-sql进行更新。

exec sp_changemergearticle @publication = 'PublicationName' 
, @article = 'TableName'
, @property = 'compensate_for_errors'
, @value = N'true'
, @force_invalidate_snapshot = true 
, @force_reinit_subscription = true

https://msdn.microsoft.com/en-us/library/microsoft.sqlserver.replication.mergearticle.compensateforerrors.aspx