指定合併發行項解析程式

本主題描述如何使用 SQL Server Management Studio 或 Transact-SQL,在 SQL Server 2014 中指定合併發行項解析程式。

本主題內容

開始之前

建議

  • 合併式複寫允許下列類型的發行項解決器:

  • 若要使用預設解決器以外的其他解決器,您必須將解決器複製到執行「合併代理程式」的電腦,然後註冊它 (如果您使用的是商務邏輯處理常式,則還必須在「發行者」端對其進行註冊)。 「合併代理程式」在以下位置上執行:

    • 發送訂閱的「散發者」端

    • 提取訂閱的「訂閱者」端

    • 使用 Web 同步處理來提取訂閱的 Microsoft Internet Information Services (IIS) 伺服器

使用 SQL Server Management Studio

註冊解析程式之後,請指定發行項應該在 [發行項屬性 - < 發行 > 項] 對話方塊的 [解析程式] 索引標籤上使用解析程式,該對話方塊可在 [新增發行集精靈] 和 [發行集屬性 - < 發行集 >] 對話方塊中使用。 如需使用精靈及存取對話方塊的詳細資訊,請參閱建立發行集檢視及修改發行集屬性

若要指定解決器

  1. 在 [新增發行集精靈] 的 [發行項] 頁面上,或是在 [發行集屬性 - <發行集>] 對話方塊中,選取一個資料表。

  2. 按一下 [發行項屬性] ,然後按一下 [設定反白顯示資料表發行項的屬性]

  3. 在 [發行項屬性 - < 發行項 > ]頁面上,按一下[解析程式]索引標籤。

  4. 選取 [使用自訂解決器 (已在散發者註冊)] ,然後在清單中按一下解決器。

  5. 如果解決器需要輸入 (例如資料行名稱),請在 [輸入解決器所需的資訊] 文字方塊中指定它。

  6. 按一下 [確定] 。

  7. 對於每個需要解決器的發行項重複此處理。

使用 TRANSACT-SQL

註冊自訂衝突解決器

  1. 如果您打算註冊您自己自訂的衝突解決器,請建立以下其中一種類型:

  2. 若要判斷所需的解析程式是否已註冊,請在任何資料庫的發行者端執行 sp_enumcustomresolvers (Transact-SQL) 。 這樣會顯示自訂解決器的描述以及在散發者上註冊之每一個以 COM 為基礎之解決器的類別識別碼 (CLSID),或是在散發者上註冊之每一個商務邏輯處理常式的 Managed 組件相關資訊。

  3. 如果所需的自訂解析程式尚未註冊,請在散發者端執行 sp_registercustomresolver (Transact-SQL) 。 為解析程式指定 @article_resolver的名稱;對於商務邏輯處理常式,這是元件的易記名稱。 針對 COM 型解析程式,針對@resolver_clsid指定 DLL 的 CLSID,並為商務邏輯處理常式指定 @is_dotnet_assembly 的值 true@dotnet_assembly_name的元件名稱,以及覆寫 BusinessLogicModule@dotnet_class_name 之類別的完整名稱。

    注意

    如果商務邏輯處理常式元件未部署在與合併代理程式可執行檔相同的目錄中、與同步啟動合併代理程式的應用程式相同的目錄中,或在全域組件快取 (GAC) 中,您必須使用@dotnet_assembly_name的元件名稱來指定完整路徑。

  4. 如果此解決器是以 COM 為基礎的解決器:

    • 將自訂解決器 DLL 複製到發送訂閱的散發者上,或是提取訂閱的訂閱者上。

      注意

      您可以在 C:\Program Files\Microsoft SQL Server\120\COM 目錄中找到 Microsoft 自訂解析程式。

    • 使用 regsvr32.exe 向作業系統註冊自訂解決器 DLL。 例如,從命令提示字元執行以下命令可註冊 SQL Server 相加衝突解決器:

      regsvr32 ssradd.dll  
      
  5. 如果解析程式是商務邏輯處理常式,請在與合併代理程式可執行檔 (replmerg.exe) 相同的資料夾中、叫用合併代理程式的應用程式,或在步驟 3 中為@dotnet_assembly_name參數指定的資料夾中部署元件。

    注意

    合併代理程式可執行檔的預設安裝位置為 C:\Program Files\Microsoft SQL Server\120\COM。

在定義合併發行項時,指定自訂解決器

  1. 如果您打算使用自訂衝突解決器,請使用以上的程序建立及註冊解決器。

  2. 在發行者上,執行 sp_enumcustomresolvers (Transact-SQL) ,並記下結果集 欄位中所需自訂解析程式的名稱。

  3. 在發行集資料庫的發行者端,執行 sp_addmergearticle (Transact-SQL)。 使用@resolver_info參數,針對@article_resolver步驟2 指定解析程式的名稱,以及自訂解析程式的任何必要輸入。 如果是以預存程序為基礎的自訂解決器, @resolver_info 會是預存程序的名稱。 如需 Microsoft 提供的解析程式必要輸入詳細資訊,請參閱 Microsoft COM 型解析程式

針對現有的合併發行項指定或變更自訂解決器

  1. 若要判斷是否已為發行項定義自訂解析程式,或取得解析程式的名稱,請執行 sp_helpmergearticle (Transact-SQL) 。 如果已針對發行項定義自訂解決器,它的名稱會顯示在 article_resolver 欄位中。 為解決器提供的任何輸入都會顯示在結果集的 resolver_info 欄位中。

  2. 在發行者上,執行 sp_enumcustomresolvers (Transact-SQL) ,並在結果集 的值 欄位中記下所需的自訂解析程式名稱。

  3. 在發行集資料庫的發行者端,執行 sp_changemergearticle (Transact-SQL)。 針對 @property 指定article_resolver值,包括商務邏輯處理常式的完整 路徑,以及步驟 2 中所需自訂解析程式的名稱,以 用於@value

  4. 若要變更自訂解析程式的任何必要輸入,請再次執行 sp_changemergearticle (Transact-SQL) 。 針對 @property 指定 resolver_info 值,以及自訂解析程式的任何必要輸入 ,以用於@value。 如果是以預存程序為基礎的自訂解決器, @resolver_info 會是預存程序的名稱。 如需必要輸入的詳細資訊,請參閱 Microsoft 以 COM 為基礎的解析程式

取消註冊自訂衝突解決器

  1. 在發行者上,執行 sp_enumcustomresolvers (Transact-SQL) ,並記下自訂解析程式的名稱,以在結果集 的值 欄位中移除。

  2. 在散發者端執行 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

另請參閱

Advanced Merge Replication Conflict Detection and Resolution
為合併發行項實作商務邏輯處理常式