指定合併發行項解析程式
適用於:SQL Server
本主題說明如何使用 SQL Server Management Studio 或 Transact-SQL,在 SQL Server 中指定合併發行項解析程式。
建議
合併式複寫允許下列類型的發行項解決器:
預設解決器。 預設解決器的行為視訂閱是客訂閱還是主訂閱而定。 如需指定訂閱類型的詳細資訊,請參閱指定合併訂閱類型和衝突解決方法優先權 (SQL Server Management Studio)。
您撰寫的自訂解決器可以是商務邏輯處理常式 (以 Managed 程式碼撰寫) 或是以 COM 為基礎的自訂解決器。 如需詳細資訊,請參閱 進階合併式複寫衝突偵測與解決。 如果您需要實作針對每一個複寫之資料列執行的自訂邏輯,而不只是針對衝突的資料列,請參閱< 為合併發行項實作商務邏輯處理常式中指定合併發行項解析程式。
COM 型標準解析程式包含在 Microsoft SQL Server 中。
若要使用預設解決器以外的其他解決器,您必須將解決器複製到執行「合併代理程式」的電腦,然後註冊它 (如果您使用的是商務邏輯處理常式,則還必須在「發行者」端對其進行註冊)。 「合併代理程式」在以下位置上執行:
發送訂閱的「散發者」端
提取訂閱的「訂閱者」端
使用 Web 同步處理來提取訂閱的 Microsoft Internet Information Services (IIS) 伺服器
使用 SQL Server Management Studio
註冊解析程式之後,您可以指定發行項應使用 [發行項屬性 - <發行項>] 對話方塊中 [解析程式] 索引標籤上的解析程式,此對話方塊位於 [新增發行集精靈] 和 [發行集屬性 - <發行集>] 對話方塊中。 如需使用精靈及存取對話方塊的詳細資訊,請參閱建立發行集和檢視及修改發行集屬性。
若要指定解決器
在 [新增發行集精靈] 的 [發行項] 頁面上,或是在 [發行集屬性 - <發行集>] 對話方塊中,選取一個資料表。
按一下 [發行項屬性] ,然後按一下 [設定反白顯示資料表發行項的屬性] 。
在 [發行項屬性 - <發行項>] 頁面,按一下 [解析程式] 索引標籤。
選取 [使用自訂解決器 (已在散發者註冊)] ,然後在清單中按一下解決器。
如果解決器需要輸入 (例如資料行名稱),請在 [輸入解決器所需的資訊] 文字方塊中指定它。
選取 [確定]。
對於每個需要解決器的發行項重複此處理。
使用 TRANSACT-SQL
註冊自訂衝突解決器
如果您打算註冊您自己自訂的衝突解決器,請建立以下其中一種類型:
以 Managed 程式碼為基礎的解決器,當做商務邏輯處理常式。 如需詳細資訊,請參閱 為合併發行項實作商務邏輯處理常式。
以預存程序為基礎的解析程式以及以 COM 為基礎的解析程式。 如需詳細資訊,請參閱 針對合併發行項實作自訂衝突解析程式。
若要判斷是否已註冊所需的解析程式,請在任何資料庫的發行者端執行 sp_enumcustomresolvers (Transact-SQL)。 這樣會顯示自訂解決器的描述以及在散發者上註冊之每一個以 COM 為基礎之解決器的類別識別碼 (CLSID),或是在散發者上註冊之每一個商務邏輯處理常式的 Managed 組件相關資訊。
如果尚未註冊所需的自訂解析程式,請在散發者端執行 sp_registercustomresolver (Transact-SQL)。 針對 @article_resolver指定解決器名稱;對於商務邏輯處理常式而言,這是組件的易記名稱。 若是 COM 型解析程式,請將 @resolver_clsid 指定為 DLL 的 CLSID,然後針對商務邏輯處理常式,將 @is_dotnet_assembly 指定為 true 值、將 @dotnet_assembly_name 指定為組件名稱,以及將 @dotnet_class_name 指定為可覆寫 BusinessLogicModule 的類別完整名稱。
注意
如果商務邏輯處理常式組件未部署在與合併代理程式可執行檔相同的目錄中、與同步啟動合併代理程式之應用程式相同的目錄中,或是全域組件快取 (GAC) 中,您就必須將 @dotnet_assembly_name指定為包含組件名稱的完整路徑。
如果此解決器是以 COM 為基礎的解決器:
將自訂解決器 DLL 複製到發送訂閱的散發者上,或是提取訂閱的訂閱者上。
注意
您可以在 C:\Program Files\Microsoft SQL Server\nnn\COM 目錄中找到 Microsoft 自訂解析程式。
使用 regsvr32.exe 向作業系統註冊自訂解決器 DLL。 例如,從命令提示字元執行以下命令可註冊 SQL Server 相加衝突解決器:
regsvr32 ssradd.dll
如果此解決器是商務邏輯處理常式,請將組件部署在與合併代理程式可執行檔 (replmerg.exe) 相同的資料夾中、與叫用合併代理程式之應用程式相同的資料夾中,或是針對步驟 3 中 @dotnet_assembly_name 參數指定的資料夾中。
注意
合併代理程式可執行檔的預設安裝位置為 C:\Program Files\Microsoft SQL Server\nnn\COM。
在定義合併發行項時,指定自訂解析程式
如果您打算使用自訂衝突解決器,請使用以上的程序建立及註冊解決器。
在發行者端,執行 sp_enumcustomresolvers (Transact-SQL),並記下結果集中 [value] 欄位內所需的自訂解析程式名稱。
在發行集資料庫的發行者端,執行 sp_addmergearticle (Transact-SQL)。 針對 @article_resolver 指定步驟 2 中的解決器名稱,並使用 @resolver_info 參數指定自訂解決器的任何必要輸入。 如果是以預存程序為基礎的自訂解決器, @resolver_info 會是預存程序的名稱。 如需 Microsoft 提供的解析程式必要輸入詳細資訊,請參閱 Microsoft COM 型解析程式。
針對現有的合併發行項,指定或變更自訂解析程式
若要判斷是否已針對發行項定義自訂解析程式,或是要取得解析程式的名稱,請執行 sp_helpmergearticle (Transact-SQL)。 如果已針對發行項定義自訂解決器,它的名稱會顯示在 article_resolver 欄位中。 為解決器提供的任何輸入都會顯示在結果集的 resolver_info 欄位中。
在發行者端,執行 sp_enumcustomresolvers (Transact-SQL),並記下結果集中 [value] 欄位內所需的自訂解析程式名稱。
在發行集資料庫的發行者端,執行 sp_changemergearticle (Transact-SQL)。 針對 @property指定 article_resolver的值,包括商務邏輯處理常式的完整路徑,並針對 @value指定步驟 2 中所需的自訂解決器名稱。
若要變更自訂解析程式的任何必要輸入,請再次執行 sp_changemergearticle (Transact-SQL)。 針對 @property 指定 resolver_info 的值,並針對 @value指定自訂解決器的任何必要輸入。 如果是以預存程序為基礎的自訂解決器, @resolver_info 會是預存程序的名稱。 如需必要輸入的詳細資訊,請參閱 Microsoft 以 COM 為基礎的解析程式。
將自訂衝突解析程式取消註冊
在發行者端,執行 sp_enumcustomresolvers (Transact-SQL),並記下結果集中 [value] 欄位內要移除的自訂解析程式名稱。
在散發者端,執行 sp_unregistercustomresolver (Transact-SQL)。 針對 @article_resolver指定步驟 1 中自訂解決器的完整名稱。
範例 (Transact-SQL)
此範例會建立新的發行項,並指定在發生衝突時,應該使用 SQL Server 平均衝突解決器來計算 [UnitPrice] 資料行的平均值。
DECLARE @publication AS sysname;
DECLARE @article AS sysname;
SET @publication = 'AdvWorksSalesOrdersMerge';
SET @article = 'Products';
EXEC sp_addmergearticle
@publication = @publication,
@article = @article,
@source_object = @article,
@article_resolver = 'Microsoft SQL Server Averaging Conflict Resolver',
@resolver_info = 'UnitPrice';
GO
這個範例會變更要指定的發行項,其方式是在發生衝突時,使用 SQL Server 相加衝突解決器來計算 [ UnitsOnOrder] 資料行的總和。
DECLARE @publication AS sysname;
DECLARE @article AS sysname;
SET @publication = 'AdvWorksSalesOrdersMerge';
SET @article = 'Products';
EXEC sp_changemergearticle
@publication = @publication,
@article = @article,
@property='article_resolver',
@value='Microsoft SQL Server Additive Conflict Resolver';
EXEC sp_changemergearticle
@publication = @publication,
@article = @article,
@property='resolver_info',
@value='UnitsOnOrder';
GO