為合併發行項實作自訂衝突解析程式
本主題描述如何使用 Transact-SQL 或 COM 型自定義解析程式,在 SQL Server 2014 中實作合併發行項的自定義衝突解決器。
本主題內容
若要使用下列項目實作合併發行項的自定義衝突解決器:
使用 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 Server 預存程式解析程式的值,以及實作 @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 元件,並使用visual Microsoft C++ 等產品,編譯成動態連結庫 (DLL)。 這類以 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 @resolver_clsid 指定 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),針對 @property 指定 @publication、@article,以及 article_resolver 值,並為 @value 指定步驟 1 中發行項解析程式的易記名稱。
檢視範例自定義解析程式
SQL Server 2000 範例檔案中提供範例。 下載sql2000samples.zip。 這會下載 3 個相當於 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 資料夾中,尋找所有 來源檔案中所有出現的 sqlres.h #include,並將其取代為 #import “replrec.dll” no_namespace,raw_interfaces_only
另請參閱
Advanced Merge Replication Conflict Detection and Resolution
以 COM 為基礎的自定義解析程式
複寫安全性最佳作法