共用方式為


如何:指定合併發行項解決器 (複寫 Transact-SQL 程式設計)

在針對合併式發行集定義發行項時,您可以指定自訂衝突解決器。如需詳細資訊,請參閱<進階合併式複寫衝突偵測與解決>。MicrosoftSQL Server 包含許多預先定義的自訂衝突解決器,或者您也可以撰寫自己的解決器。如果您需要實作針對每一個複寫之資料列執行的自訂邏輯,而不只是針對衝突的資料列,請參閱<如何:為合併發行項實作商務邏輯處理常式 (複寫程式設計)>。

註冊自訂衝突解決器

  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 指定為組件的名稱,並將 @dotnet_class_name 指定為覆寫 BusinessLogicModule 之類別的完整名稱。

    [!附註]

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

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

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

      [!附註]

      可以在 C:\Program Files\Microsoft SQL Server\100\COM 目錄中找到 Microsoft 自訂解決器。

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

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

    [!附註]

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

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

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

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

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

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

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

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

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

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

取消註冊自訂衝突解決器

  1. 在發行者上,執行 sp_enumcustomresolvers (Transact-SQL),並記下結果集中 value 欄位內要移除的自訂解決器名稱。

  2. 在散發者端執行 sp_unregistercustomresolver (Transact-SQL)。針對 @article_resolver 指定步驟 1 中自訂解決器的完整名稱。

範例

此範例會建立新的發行項,並指定在發生衝突時,應該使用 SQL Server Averaging Conflict Resolver 來計算 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 Additive Conflict Resolver 計算 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