如何:針對合併發行項實作以預存程序為基礎的自訂衝突解決器 (複寫 Transact-SQL 程式設計)

您可以將自訂衝突解決器撰寫為每一個發行者上的 Transact-SQL 預存程序。在同步處理期間,當註冊解決器的發行項中遇到衝突時,就會叫用此預存程序,而且衝突資料列的相關資訊會由合併代理程式傳遞給此程序所需的參數。一定會在發行者上建立以預存程序為基礎的自訂衝突解決器。

[!附註]

MicrosoftSQL Server 預存程序解決器的叫用目的,只是為了處理資料列變更衝突。這些解決器不能用於處理其他類型的衝突,例如因為 PRIMARY KEY 違規或唯一索引條件約束違規而發生的插入失敗。

建立以預存程序為基礎的自訂衝突解決器

  1. 在發行集或 msdb 資料庫的發行者上,建立新的系統預存程序,以實作下列必要的參數:

    參數

    資料類型

    描述

    @tableowner

    sysname

    解決衝突所針對之資料表的擁有者名稱。這是發行集資料庫中資料表的擁有者。

    @tablename

    sysname

    解決衝突所針對之資料表的名稱。

    @rowguid

    uniqueidentifier

    發生衝突之資料列的唯一識別碼。

    @subscriber

    sysname

    傳播衝突變更所在的伺服器名稱。

    @subscriber_db

    sysname

    傳播衝突變更所在的資料庫名稱。

    @log_conflict OUTPUT

    int

    合併處理是否應該記錄衝突供稍後解決之用:

    0 = 不記錄衝突。

    1 = 訂閱者為衝突失敗者。

    2 = 發行者為衝突失敗者。

    @conflict_message OUTPUT

    nvarchar(512)

    當記錄衝突時,要提供之有關解決方法的訊息。

    @destowner

    sysname

    訂閱者上發行之資料表的擁有者。

    此預存程序會使用由合併代理程式傳遞給這些參數的值,以實作自訂衝突解決邏輯;它必須傳回結構上與基底資料表相同的單一資料列結果集,並包含此資料列之獲勝版本的資料值。

  2. 將預存程序的 EXECUTE 權限授與給訂閱者使用的任何登入,以連接到發行者。

搭配新的資料表發行項使用自訂衝突解決器

搭配現有的資料表發行項使用自訂衝突解決器

  1. 執行 sp_changemergearticle,指定 @publication@article,並針對 @property 指定 article_resolver 的值及針對 @value 指定 MicrosoftSQL Server Stored ProcedureResolver 的值。

  2. 執行 sp_changemergearticle,指定 @publication@article、針對 @property 指定 resolver_info 的值及針對 @value 指定可實作衝突解決器邏輯的預存程序名稱。