【问题标题】:Merge Replication Unique Key Constraint合并复制唯一键约束
【发布时间】:2015-10-13 15:12:53
【问题描述】:

我在两台服务器上设置了 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”。此失败可能是由违反约束引起的。违反 UNIQUE KEY 约束“UK_keys”。无法在对象“dbo.tblPeople”中插入重复键。重复键值为 (1, 1, 1)。

我读到的所有内容都建议添加唯一的 guid 或使用标识列,这不是解决此问题的方法。身份范围很好用,我什至可以创建自己的 rowguid,但这仍然不能解决我最终需要手动删除记录的约束冲突。

这个人问了一个类似的问题,但我需要 guid 和身份之上的唯一键。 Automatically resolve primary key merge conflict

【问题讨论】:

    标签: sql-server replication merge-replication


    【解决方案1】:

    已通过在合并文章上将 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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-12
    • 1970-01-01
    • 2011-05-28
    • 2019-05-03
    • 2021-09-30
    • 2016-06-19
    • 2011-05-25
    相关资源
    最近更新 更多