2015-10-13 139 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