針對合併發行項實作自訂衝突解析程式
適用於:SQL Server
此主題描述如何使用 Transact-SQL 或以 COM 為基礎的自訂解析程式,在 SQL Server 中針對合併發行項實作自訂衝突解決器。
本主題內容
針對合併發行項實作自訂衝突解析程式,使用:
使用 TRANSACT-SQL
您可以將自訂衝突解決器撰寫為每一個發行者上的 Transact-SQL 預存程序。 在同步處理期間,當解析程式註冊到的發行項中發生衝突時,就會叫用這個預存程序。 衝突資料列的相關資訊會由合併代理程式傳遞至程序的必要參數。 一定會在發行者上建立以預存程序為基礎的自訂衝突解決器。
注意
Microsoft SQL Server 預存程序解析程式的叫用目的,只是為了處理資料列變更衝突。 這些解析程式不能用於處理其他類型的衝突,例如因 PRIMARY KEY 違規或唯一索引條件約束違規而觸發的插入失敗。
建立以預存程序為基礎的自訂衝突解決器
在發行集或 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 訂閱者上發行之資料表的擁有者。 這個預存程序會使用由合併代理程式傳遞給這些參數的值,來實作您的自訂衝突解析邏輯。 它必須將結構中與基底資料表相同的單一資料列結果集傳回,且包含獲勝版本資料列的資料值。
將預存程序的 EXECUTE 權限授與給訂閱者使用的任何登入,以連接到發行者。
搭配新的資料表發行項使用自訂衝突解析程式
執行 sp_addmergearticle 以定義發行項。
為 @article_resolver 參數指定 MicrosoftSQL 伺服器預存程序解析程式的值。
指定實作 @resolver_info 參數的衝突解析程式邏輯的預存程序名稱。
如需詳細資訊,請參閱定義發行項。
搭配現有的資料表發行項使用自訂衝突解決器
執行 sp_changemergearticle、指定 @publication、@article、@property 的 article_resolver 值,以及 @value 的 MicrosoftSQL 伺服器預存程序解析程式值。
執行 sp_changemergearticle,指定 @publication、 @article、針對 @property 指定 resolver_info的值及針對 @value指定可實作衝突解決器邏輯的預存程序名稱。
使用以 COM 為基礎的自訂解析程式
Microsoft.SqlServer.Replication.BusinessLogicSupport 命名空間會實作一個介面,此介面可讓您撰寫複雜的商務邏輯來處理事件,並解決合併複寫同步處理程序期間所發生的衝突。 如需詳細資訊,請參閱為合併發行項實作商務邏輯處理常式。 您也可以撰寫自己的原生程式碼式自訂商務邏輯,以解決衝突。 此邏輯會建置為 COM 元件,並編譯成動態連結程式庫 (DLL) (使用如 Microsoft Visual C++ 的產品)。 這種以 COM 為基礎的自訂衝突解析程式必須實作 ICustomResolver 介面,此介面是專門針對衝突解決所設計。
建立及註冊以 COM 為基礎的自訂衝突解決器
在 COM 相容的撰寫環境中,加入對自訂衝突解決器程式庫的參考。
針對 Visual C++ 專案,使用 #import 指示詞將此程式庫匯入專案中。
建立可實作 ICustomResolver 介面的類別。
實作特定的方法和屬性。
建立專案來建立自訂衝突解決器程式庫檔案。
在包含合併代理程式可執行檔的目錄 (通常是 \Microsoft SQL Server\100\COM) 中部署此程式庫。
注意
如果是提取訂閱,則必須在訂閱者上部署自訂衝突解決器,如果是發送訂閱,則必須在散發者上部署,或是在搭配 Web 同步處理的 Web 伺服器上部署。
透過從部署目錄執行 regsvr32.exe 註冊自訂衝突解決器程式庫,如下面所示:
regsvr32.exe mycustomresolver.dll
在發行者端,執行 sp_enumcustomresolvers (發佈Transact-SQL),以確認此程式庫尚未註冊為自訂衝突解析程式。
若要將此程式庫註冊為自訂衝突解析程式,請在散發者端執行 sp_registercustomresolver (Transact-SQL)。 針對 @article_resolver指定 COM 物件的易記名稱、針對 @resolver_clsid指定此程式庫的識別碼 (CLSID),以及針對 @is_dotnet_assembly false 指定 的值。
注意
當不再需要時,您可以透過使用 sp_unregistercustomresolver (Transact-SQL) 來取消註冊自訂衝突解析程式。
(選擇性) 在叢集上重複步驟 6-9,在此叢集的所有節點上註冊自訂解析程式。 要確定自訂解析程式可以在容錯移轉之後適當地載入重新調整器時,必須進行這些步驟。
搭配新的資料表發行項使用自訂衝突解決器
在發行者端,執行 sp_enumcustomresolvers (Transact-SQL),並記下所需解析程式的易記名稱。
在發行集資料庫的發行者端,執行 sp_addmergearticle (Transact-SQL) 來定義發行項。 針對 @article_resolver指定步驟 1 中發行項解析程式的易記名稱。 如需詳細資訊,請參閱定義發行項。
搭配現有的資料表發行項使用自訂衝突解決器
在發行者端,執行 sp_enumcustomresolvers (Transact-SQL),並記下所需解析程式的易記名稱。
執行 sp_changemergearticle (Transact-SQL),針對 @property 指定 @publication、@article,以及 article_resolver 值,並為 @value 指定步驟 1 中發行項解析程式的易記名稱。