次の方法で共有


マージ アーティクルのカスタム競合回避モジュールの実装

このトピックでは、Transact-SQL または COM ベースのカスタム 競合回避モジュールを使用して、SQL Server 2014 でマージ アーティクルのカスタム競合回避モジュールを実装する方法について説明

このトピックの内容

Transact-SQL の使用

各パブリッシャーで、固有のカスタム競合回避モジュールを Transact-SQL ストアド プロシージャとして記述できます。 同期中に、このストアド プロシージャは、競合回避モジュールが登録されているアーティクル内で競合が発生した場合に呼び出されます。競合する行の情報は、マージ エージェントによってプロシージャの必須パラメーターに渡されます。 ストアド プロシージャ ベースのカスタム競合回避モジュールは、常にパブリッシャーで作成されます。

Note

Microsoft SQL Server ストアド プロシージャ リゾルバーは、行の変更ベースの競合を処理するためにのみ呼び出されます。 このモジュールは、他の種類の競合 (PRIMARY KEY 違反による挿入の失敗や一意インデックス制約違反) の処理には使用できません。

ストアド プロシージャ ベースのカスタム競合回避モジュールを作成するには

  1. パブリッシャーのパブリケーションまたは 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 サブスクライバー側でパブリッシュされたテーブルの所有者。

    このストアド プロシージャは、マージ エージェントからパラメーターに渡された値を使用して、カスタム競合回避ロジックを実装します。このロジックでは、ベース テーブルと同じ構造を持ち、競合で優先されたバージョンの行のデータ値を含んでいる、単一行の結果セットを返す必要があります。

  2. サブスクライバーでパブリッシャーへの接続に使用される任意のログインに対して、ストアド プロシージャの EXECUTE 権限を許可します。

新しいテーブル アーティクルにカスタム競合回避モジュールを使用するには

  1. sp_addmergearticleを実行してアーティクルを定義します。MicrosoftSQL Server Stored Procedure Resolver @article_resolver パラメーターの値と、@resolver_info パラメーターの競合回避ロジックを実装するストアド プロシージャの名前を指定します。 詳しくは、「 アーティクルを定義」をご覧ください。

既存のテーブル アーティクルにカスタム競合回避モジュールを使用するには

  1. @publication@article を指定し、@propertyarticle_resolver の値を、@valueMicrosoftSQL Server Stored ProcedureResolver の値を指定して、sp_changemergearticle を実行します。

  2. @publication@articleを指定し、 @propertyresolver_info の値を、 @valueに競合回避ロジックを実装するストアド プロシージャの名前を指定して、 sp_changemergearticleを実行します。

COM ベースのカスタム競合回避モジュールの使用

Microsoft.SqlServer.Replication.BusinessLogicSupport 名前空間により実装されるインターフェイスを利用して、マージ レプリケーション同期処理で発生するイベントを処理し、競合を回避するための複雑なビジネス ロジックを作成できます。 詳細については、「 マージ アーティクルのビジネス ロジック ハンドラーの実装」を参照してください。 また、ネイティブ コード ベースのカスタム ビジネス ロジックを独自に作成して、競合を回避することもできます。 このロジックは COM コンポーネントとして構築され、Microsoft Visual C++ などの製品を使用してダイナミック リンク ライブラリ (DLL) にコンパイルされます。 このような COM ベースのカスタム競合回避モジュールには、競合回避のために用意されている専用の ICustomResolver インターフェイスを実装する必要があります。

COM ベース カスタム競合回避モジュールを作成して登録するには

  1. COM 互換のオーサリング環境で、カスタム競合回避モジュール ライブラリへの参照を追加します。

  2. Visual C++ プロジェクトの場合は、#import ディレクティブを使用してこのライブラリをプロジェクトにインポートします。

  3. ICustomResolver インターフェイスを実装するクラスを作成します。

  4. メソッドとプロパティを実装します。

  5. プロジェクトをビルドして、カスタム競合回避モジュール ライブラリ ファイルを作成します。

  6. マージ エージェントの実行可能ファイルが置かれているディレクトリ (通常は \Microsoft SQL Server\100\COM) に、そのライブラリを配置します。

    Note

    カスタム競合回避モジュールは、プル サブスクリプションの場合はサブスクライバーに、プッシュ サブスクリプションの場合はディストリビューターに、Web 同期に使用する場合は Web サーバーに配置する必要があります。

  7. 次のように、配置先のディレクトリから regsvr32.exe を使用してカスタム競合回避モジュール ライブラリを登録します。

    regsvr32.exe mycustomresolver.dll  
    
  8. パブリッシャーで、 sp_enumcustomresolvers (Transact-SQL) を実行して、ライブラリがまだカスタム競合回避モジュールとして登録されていないことを確認します。

  9. ライブラリをカスタム競合回避モジュールとして登録するには、ディストリビューターで sp_registercustomresolver (Transact-SQL)を実行します。 @article_resolverの COM オブジェクトのフレンドリ名、@resolver_clsidのライブラリの ID (CLSID)、および@is_dotnet_assemblyfalseの値を指定します。

    Note

    必要がなくなったら、 sp_unregistercustomresolver (Transact-SQL)を使用して、カスタム競合回避モジュールの登録を解除できます。

  10. (省略可) クラスターで手順 5. ~ 8. を繰り返して、クラスターの全ノードにカスタム競合回避モジュールを登録します。 この手順は、フェールオーバーの後にカスタム競合回避モジュールに調整エージェントを適切に読み込むために必要です。

新しいテーブル アーティクルにカスタム競合回避モジュールを使用するには

  1. パブリッシャーで、 sp_enumcustomresolvers (Transact-SQL) を実行し、目的のリゾルバーのフレンドリ名をメモします。

  2. パブリッシャー側のパブリケーション データベースに対して、sp_addmergearticle (Transact-SQL) を実行してアーティクルを定義します。 手順 1. で調べたアーティクル競合回避モジュールの表示名を @article_resolverに指定します。 詳しくは、「 アーティクルを定義」をご覧ください。

既存のテーブル アーティクルにカスタム競合回避モジュールを使用するには

  1. パブリッシャーで、 sp_enumcustomresolvers (Transact-SQL) を実行し、目的のリゾルバーのフレンドリ名をメモします。

  2. sp_changemergearticle (Transact-SQL) を実行し、@publication@article を指定し、@propertyarticle_resolver 値、@value に手順 1 のアーティクル競合回避モジュールの表示名を指定します。

サンプルのカスタム競合回避モジュールの表示

  1. SQL Server 2000 サンプル ファイルにサンプルが提供されています。 sql2000samples.zipをダウンロードします。 これにより、6.9 MB の 3 つのファイルがダウンロードされます。

  2. ダウンロードされた圧縮済み .cab ファイルからファイルを抽出します。

  3. setup.exeを実行します。

    Note

    インストール オプションを選択する場合は、 レプリケーション サンプルをインストールするだけで済みます。 (既定のインストール パスは C:\Program Files (x86)\Microsoft SQL Server 2000 Samples\1033\)

  4. インストール フォルダーに移動します。 (既定のフォルダーは C:\Program Files (x86)\Microsoft SQL Server 2000 Samples\1033\sqlrepl\unzip_sqlreplSP3.exe)

  5. unzip_sqlreplSP3.exe プログラムを実行します。

    Note

    サンプルの com 競合回避モジュールが (既定で) C:\Program Files (x86)\Microsoft SQL Server 2000 Samples\1033\sqlrepl\resolver\subspres フォルダーにインストールします。

  6. subspres フォルダーで、すべてのソース ファイルで #include sqlres.h を検出し、 #import "replrec.dll" no_namespace, raw_interfaces_onlyで置き換えます。

参照

Advanced Merge Replication Conflict Detection and Resolution
COM ベースのカスタム競合回避モジュール
レプリケーション セキュリティの推奨事項