マージ アーティクル競合回避モジュールの指定

適用対象: SQL Server

このトピックでは、SQL Server Management Studio または Transact-SQL を使用して、SQL Server で統合アーティクルリゾルバーを指定する方法について説明します。

推奨事項

  • マージ レプリケーションでは、以下の競合回避モジュールが使用できます。

  • 既定以外の競合回避モジュールを使用する場合は、マージ エージェントが動作しているコンピューターにそのモジュールをコピーして登録する必要があります (ビジネス ロジック ハンドラーを使用している場合は、そのビジネス ロジック ハンドラーもパブリッシャー側で登録する必要があります)。 マージ エージェントは、以下の場所で実行されます。

    • プッシュ サブスクリプションの場合はディストリビューター

    • プル サブスクリプションの場合はサブスクライバー

    • Web 同期を使用するプル サブスクリプションの場合は Microsoft インターネット インフォメーション サービス (IIS) サーバー

SQL Server Management Studio を使用する

リゾルバーを登録した後、[アーティクルのプロパティ - <アーティクル]> ダイアログ ドロップダウン リストの [リゾルバー] タブでアーティクルがリゾルバーを使用するように指定します。このダイアログ ドロップダウン リストは、パブリケーションの新規作成ウィザードおよび [パブリケーションのプロパティ - <パブリケーション]> ダイアログ ドロップダウン リストから使用できます。 ウィザードの使用およびダイアログ ボックスへのアクセスの詳細については、「パブリケーションの作成」および「View and Modify Publication Properties」 (パブリケーション プロパティの表示および変更) を参照してください。

競合回避モジュールを指定するには

  1. パブリケーションの新規作成ウィザードの [アーティクル] ページまたは [パブリケーションのプロパティ - <パブリケーション]> ダイアログ ドロップダウン リストで、テーブルを選択します。

  2. [アーティクルのプロパティ]をクリックしてから、 [反転表示されたテーブル アーティクルのプロパティを設定]をクリックします。

  3. [アーティクルのプロパティ - <アーティクル]> ページで、[リゾルバー] タブをクリックします。

  4. [ディストリビューターに登録されたカスタム競合回避モジュールを使用する]を選択し、一覧から競合回避モジュールをクリックします。

  5. 競合回避モジュールが入力 (列名など) を必要とする場合は [競合回避モジュールが必要とする情報の入力] ボックスで指定します。

  6. [OK] を選択します。

  7. 競合回避モジュールを必要とする各アーティクルについて、この処理を繰り返します。

Transact-SQL の使用

カスタム競合回避モジュールを登録するには

  1. 固有のカスタム競合回避モジュールを登録する場合は、次のいずれかの種類を作成します。

  2. 目的のリゾルバーが既に登録されているかを判断するには、パブリッシャーの任意のデータベースに対して sp_enumcustomresolvers (Transact-SQL) を実行します。 これにより、カスタム競合回避モジュールの説明、およびディストリビューターに登録された各 COM ベースの競合回避モジュールのクラス識別子 (LSID)、またはディストリビューターに登録された各ビジネス ロジック ハンドラーのマネージド アセンブリの情報が表示されます。

  3. 目的のカスタムリゾルバーがまだ登録されていない場合は、ディストリビューターで sp_registercustomresolver (Transact-SQL) を実行します。 @article_resolverに競合回避モジュールの名前を指定します。ビジネス ロジックの場合はアセンブリの表示名です。 COM ベースのリゾルバーの場合は、@resolver_clsid に DLL の CLSID を指定し、ビジネス ロジック ハンドラーの場合は、@is_dotnet_assemblytrue@dotnet_assembly_name にアセンブリの名前、@dotnet_class_nameBusinessLogicModule をオーバーライドするクラスの完全修飾名を指定します。

    Note

    マージ エージェント実行可能ファイルがあるディレクトリ、マージ エージェントを同期的に起動するアプリケーションがあるディレクトリ、およびグローバル アセンブリ キャッシュ (GAC) の、いずれとも異なる場所にビジネス ロジック ハンドラー アセンブリが配置されている場合は、 @dotnet_assembly_nameにアセンブリ名を含む完全なパスを指定する必要があります。

  4. 競合回避モジュールが COM ベースの場合

    • カスタム競合回避モジュール DLL をプッシュ サブスクリプションのディストリビューター、またはプル サブスクリプションのサブスクライバーにコピーします。

      Note

      Microsoft カスタム リゾルバーは、C:\Program Files\Microsoft SQL Server\nnn\COM ディレクトリにあります。

    • regsvr32.exe を使用して、カスタム競合回避モジュール DLL をオペレーティング システムに登録します。 たとえば、次のコマンドをコマンド プロンプトから実行すると、以下の SQL Server Additive 競合回避モジュール が登録されます。

      regsvr32 ssradd.dll  
      
  5. 競合回避モジュールがビジネス ロジック ハンドラーである場合は、マージ エージェント実行可能ファイル (replmerg.exe) と同じフォルダー、マージ エージェントを起動するアプリケーションと同じフォルダー、または手順 3. で @dotnet_assembly_name パラメーターに指定したフォルダーのいずれかにアセンブリを配置します。

    Note

    マージ エージェント実行可能ファイルの既定のインストール場所は C:\Program Files\Microsoft SQL Server\nnn\COM です。

マージ アーティクルを定義するときのカスタム競合回避モジュールの指定

  1. カスタム競合回避モジュールを使用する場合は、上記の手順に従って競合回避モジュールを作成および登録します。

  2. パブリッシャーで、sp_enumcustomresolvers (Transact-SQL) を実行し、結果セットの value フィールドに示された目的のカスタムリゾルバーの名前を確認します。

  3. パブリッシャー側のパブリケーション データベースに対して、sp_addmergearticle (Transact-SQL) を実行します。 @article_resolver に手順 2. の競合回避モジュールの名前を指定し、 @resolver_info パラメーターを使ってカスタム競合回避モジュールの必須入力をすべて指定します。 ストアド プロシージャ ベースのカスタム競合回避モジュールの場合、 @resolver_info はストアド プロシージャの名前です。 Microsoft によって提供されるリゾルバーの必須入力の詳細については、「Microsoft COM ベースのリゾルバー」を参照してください。

既存のマージ アーティクルに対するカスタム競合回避モジュールの指定または変更

  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) を再度実行します。 @propertyresolver_info を、 @valueにカスタム競合回避モジュールの必須入力を指定します。 ストアド プロシージャ ベースのカスタム競合回避モジュールの場合、 @resolver_info はストアド プロシージャの名前です。 必須入力の詳細については、「Microsoft COM ベースの競合回避モジュール」を参照してください。

カスタム競合回避モジュールの登録の解除

  1. パブリッシャーで sp_enumcustomresolvers (Transact-SQL) を実行し、結果セットの value フィールドに示された、削除するカスタムリゾルバーの名前を確認します。

  2. ディストリビューターで、sp_unregistercustomresolver (Transact-SQL) を実行します。 @article_resolverに、手順 1. のカスタム競合回避モジュールの完全な名前を指定します。

例 (Transact-SQL)

次の例では、新しいアーティクルを作成し、競合が発生したときに UnitPrice 列の平均の計算に SQL Server Averaging 競合回避モジュール が使用されるように指定します。

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

次の例では、アーティクルを変更して、競合が発生したときに UnitsOnOrder 列の合計の計算に SQL Server Additive 競合回避モジュール が使用されるように指定します。

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
マージ アーティクルのビジネス ロジック ハンドラーの実装