共用方式為


針對合併發行項實作自訂衝突解析程式

適用於:SQL Server

此主題描述如何使用 Transact-SQL 或以 COM 為基礎的自訂解析程式,在 SQL Server 中針對合併發行項實作自訂衝突解決器。

本主題內容

使用 TRANSACT-SQL

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

注意

Microsoft SQL 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_addmergearticle 以定義發行項。

  2. @article_resolver 參數指定 MicrosoftSQL 伺服器預存程序解析程式的值。

  3. 指定實作 @resolver_info 參數的衝突解析程式邏輯的預存程序名稱。

    如需詳細資訊,請參閱定義發行項

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

  1. 執行 sp_changemergearticle、指定 @publication@article@propertyarticle_resolver 值,以及 @valueMicrosoftSQL 伺服器預存程序解析程式值。

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

使用以 COM 為基礎的自訂解析程式

Microsoft.SqlServer.Replication.BusinessLogicSupport 命名空間會實作一個介面,此介面可讓您撰寫複雜的商務邏輯來處理事件,並解決合併複寫同步處理程序期間所發生的衝突。 如需詳細資訊,請參閱為合併發行項實作商務邏輯處理常式。 您也可以撰寫自己的原生程式碼式自訂商務邏輯,以解決衝突。 此邏輯會建置為 COM 元件,並編譯成動態連結程式庫 (DLL) (使用如 Microsoft Visual C++ 的產品)。 這種以 COM 為基礎的自訂衝突解析程式必須實作 ICustomResolver 介面,此介面是專門針對衝突解決所設計。

建立及註冊以 COM 為基礎的自訂衝突解決器

  1. 在 COM 相容的撰寫環境中,加入對自訂衝突解決器程式庫的參考。

  2. 針對 Visual C++ 專案,使用 #import 指示詞將此程式庫匯入專案中。

  3. 建立可實作 ICustomResolver 介面的類別。

  4. 實作特定的方法和屬性。

  5. 建立專案來建立自訂衝突解決器程式庫檔案。

  6. 在包含合併代理程式可執行檔的目錄 (通常是 \Microsoft SQL Server\100\COM) 中部署此程式庫。

    注意

    如果是提取訂閱,則必須在訂閱者上部署自訂衝突解決器,如果是發送訂閱,則必須在散發者上部署,或是在搭配 Web 同步處理的 Web 伺服器上部署。

  7. 透過從部署目錄執行 regsvr32.exe 註冊自訂衝突解決器程式庫,如下面所示:

    regsvr32.exe mycustomresolver.dll  
    
  8. 在發行者端,執行 sp_enumcustomresolvers (發佈Transact-SQL),以確認此程式庫尚未註冊為自訂衝突解析程式。

  9. 若要將此程式庫註冊為自訂衝突解析程式,請在散發者端執行 sp_registercustomresolver (Transact-SQL)。 針對 @article_resolver指定 COM 物件的易記名稱、針對 @resolver_clsid指定此程式庫的識別碼 (CLSID),以及針對 @is_dotnet_assembly false 指定 的值。

    注意

    當不再需要時,您可以透過使用 sp_unregistercustomresolver (Transact-SQL) 來取消註冊自訂衝突解析程式。

  10. (選擇性) 在叢集上重複步驟 6-9,在此叢集的所有節點上註冊自訂解析程式。 要確定自訂解析程式可以在容錯移轉之後適當地載入重新調整器時,必須進行這些步驟。

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

  1. 在發行者端,執行 sp_enumcustomresolvers (Transact-SQL),並記下所需解析程式的易記名稱。

  2. 在發行集資料庫的發行者端,執行 sp_addmergearticle (Transact-SQL) 來定義發行項。 針對 @article_resolver指定步驟 1 中發行項解析程式的易記名稱。 如需詳細資訊,請參閱定義發行項

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

  1. 在發行者端,執行 sp_enumcustomresolvers (Transact-SQL),並記下所需解析程式的易記名稱。

  2. 執行 sp_changemergearticle (Transact-SQL),針對 @property 指定 @publication@article,以及 article_resolver 值,並為 @value 指定步驟 1 中發行項解析程式的易記名稱。