合并复制唯一键约束
Merge Replication Unique Key Constraint
我在两台服务器上设置了 SQL 服务器合并复制,并且在同步 运行 时出现了键约束错误。我解决这个问题的唯一方法是删除其中一台服务器上的记录,然后 运行 同步。
问题:有没有一种方法可以配置复制或解析器,以便在遇到唯一键或主键违规时发布者记录获胜,而订阅者记录自动删除?
样本Table:
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
这已通过在合并文章中将 compensate_for_errors 设置为 true 来解决。默认情况下 SQL 服务器在发生约束错误时不会触发解析器。您无法通过用户界面更改此设置,必须使用 t-sql 来更新它。
exec sp_changemergearticle @publication = 'PublicationName'
, @article = 'TableName'
, @property = 'compensate_for_errors'
, @value = N'true'
, @force_invalidate_snapshot = true
, @force_reinit_subscription = true
我在两台服务器上设置了 SQL 服务器合并复制,并且在同步 运行 时出现了键约束错误。我解决这个问题的唯一方法是删除其中一台服务器上的记录,然后 运行 同步。
问题:有没有一种方法可以配置复制或解析器,以便在遇到唯一键或主键违规时发布者记录获胜,而订阅者记录自动删除?
样本Table:
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
这已通过在合并文章中将 compensate_for_errors 设置为 true 来解决。默认情况下 SQL 服务器在发生约束错误时不会触发解析器。您无法通过用户界面更改此设置,必须使用 t-sql 来更新它。
exec sp_changemergearticle @publication = 'PublicationName'
, @article = 'TableName'
, @property = 'compensate_for_errors'
, @value = N'true'
, @force_invalidate_snapshot = true
, @force_reinit_subscription = true