2015-10-13 141 views
0

我有两台服务器上的SQL Server合并复制设置,并且在同步运行时出现密钥约束错误。我可以解决此问题的唯一方法是删除其中一台服务器上的记录,然后运行同步。合并复制唯一密钥约束

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

样品表:

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'。这种失败可能是由违反约束条件造成的。违反唯一键约束'UK_keys'。无法在对象'dbo.tblPeople'中插入重复键。重复的键值是(1,1,1)。

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

这个人问了一个类似的问题,但我需要在指导和身份顶部的唯一键。 Automatically resolve primary key merge conflict

回答

0

这可以通过在合并文章中将refour_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

+0

链接已经死了。现在可在https://msdn.microsoft.com/en-us/library/ms153258.aspx上找到 – wes