針對合併發行項實作自訂衝突解析程式
本主題描述如何使用 Transact-SQL 或是以 COM 為基礎的自訂解析程式,在 SQL Server 2012 中針對合併發行項實作自訂衝突解析程式。
本主題內容
若要針對合併發行項實作自訂衝突解析程式,請使用:
Transact-SQL
以 COM 為基礎的解析程式
使用 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 參數指定 Microsoft SQL Server 預存程序解析程式 的值,並針對 @resolver_info 參數指定可實作衝突解決器邏輯的預存程序名稱。 如需詳細資訊,請參閱<定義發行項>。
搭配現有的資料表發行項使用自訂衝突解決器
執行 sp_changemergearticle,指定 @publication、@article,並針對 @property 指定 article_resolver 的值及針對 @value 指定 MicrosoftSQL Server Stored Procedure Resolver 的值。
執行 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) 來取消註冊自訂衝突解決器。
(選擇性) 在叢集上重複步驟 5-8,在此叢集的所有節點上註冊自訂解決器。 要確定自訂解決器將能夠在容錯移轉之後適當地載入重新調整器時,必須進行這項處理。
搭配新的資料表發行項使用自訂衝突解決器
在發行者上,執行 sp_enumcustomresolvers (Transact-SQL),並記下所需之解決器的易記名稱。
在發行集資料庫的發行者上,執行 sp_addmergearticle (Transact-SQL) 來定義發行項。 針對 @article_resolver 指定步驟 1 中發行項解析程式的易記名稱。 如需詳細資訊,請參閱<定義發行項>。
搭配現有的資料表發行項使用自訂衝突解決器
在發行者上,執行 sp_enumcustomresolvers (Transact-SQL),並記下所需之解決器的易記名稱。
執行 sp_changemergearticle (Transact-SQL),指定 @publication、@article、為 @property 設定的 article_resolver 值,以及為 @value 設定之步驟 1 中發行項解析程式的易記名稱。
[回到首頁]
檢視範例自訂解析程式
SQL Server 2000 範例檔案中提供範例。 從 SQL Server 2000 Service Pack 3 的更新範例下載 sql2000samples.cab。 這會下載 8 個檔案,大小總計為 6.9 MB。
從下載的壓縮 .cab 檔案中解壓縮檔案。
執行 setup.exe
[!附註]
選擇安裝選項時,只需要安裝覆寫範例 (預設安裝路徑是 C:\Program Files (x86)\Microsoft SQL Server 2000 Samples\1033\)。
移至安裝資料夾 (預設資料夾為 C:\Program Files (x86)\Microsoft SQL Server 2000 Samples\1033\sqlrepl\unzip_sqlreplSP3.exe)。
執行 unzip_sqlreplSP3.exe 程式。
[!附註]
範例 com 解析程式會安裝 (依預設) 至 C:\Program Files (x86)\Microsoft SQL Server 2000 Samples\1033\sqlrepl\resolver\subspres 資料夾。
在 subspres 資料夾,尋找在所有來源檔案中出現的所有 #include sqlres.h 項目,並將其取代為 #import "replrec.dll" no_namespace, raw_interfaces_only