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

本主題描述如何使用 Transact-SQL 或 COM 型自定義解析程式,在 SQL Server 2014 中實作合併發行項的自定義衝突解決器

本主題內容

使用 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來定義發行項,並針對 @article_resolver 參數指定 MicrosoftSQL Server 預存程式解析程式的值,以及實作 @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 元件,並使用visual Microsoft C++ 等產品,編譯成動態連結庫 (DLL)。 這類以 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 @resolver_clsid 指定 COM 物件的易記名稱、@resolver_clsid的連結庫識別碼 (CLSID)和 @is_dotnet_assembly 的值false

    注意

    不再需要時,可以使用 sp_unregistercustomresolver (Transact-SQL) 取消註冊自定義衝突解決器。

  10. (選擇性)在叢集上,重複步驟 5-8,在叢集的所有節點上註冊自定義解析程式。 這需要確保自定義解析程式能夠在故障轉移之後正確載入協調器。

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

  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 中發行項解析程式的易記名稱。

檢視範例自定義解析程式

  1. SQL Server 2000 範例檔案中提供範例。 下載sql2000samples.zip。 這會下載 3 個相當於 6.9 MB 的檔案。

  2. 從下載的壓縮.cab檔案擷取檔案。

  3. 執行 setup.exe

    注意

    選擇安裝選項時,只需要安裝 寫範例。 (預設安裝路徑為 C:\Program Files (x86)\Microsoft SQL Server 2000 Samples\1033\

  4. 移至安裝資料夾。 (預設資料夾為 C:\Program Files (x86)\Microsoft SQL Server 2000 Samples\1033\sqlrepl\unzip_sqlreplSP3.exe

  5. 執行unzip_sqlreplSP3.exe程式。

    注意

    範例 com 解析程式會安裝 C:\Program Files (x86)\Microsoft SQL Server 2000 Samples\1033\sqlrepl\resolver\subspres 資料夾。

  6. subspres 資料夾中,尋找所有 來源檔案中所有出現的 sqlres.h #include,並將其取代為 #import “replrec.dll” no_namespace,raw_interfaces_only

另請參閱

Advanced Merge Replication Conflict Detection and Resolution
以 COM 為基礎的自定義解析程式
複寫安全性最佳作法