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

適用対象:SQL Server

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

Transact-SQL の使用

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

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

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

  1. パブリッシャーのパブリケーションまたは msdb データベースで、次の必須パラメーターを実装する新しいシステム ストアド プロシージャを作成します。

    パラメーター データ型 説明
    @tableowner sysname 競合を解決する対象のテーブルの所有者名。 これは、パブリケーション データベース内のテーブルの所有者です。
    @tablename sysname 競合を解決する対象のテーブル名。
    @rowguid uniqueidentifier 競合がある行の一意の識別子。
    @subscriber sysname 競合する変更の反映元であるサーバーの名前。
    @subscriber_db sysname 競合する変更の反映元であるデータベースの名前。
    @log_conflict 出力 int 後で解決できるように、マージ処理で競合をログに記録するかどうかを設定します。

    0 = 競合をログに記録しない。

    1 = サブスクライバーは競合の敗者です。

    2 = パブリッシャーは競合に負けた側です。
    @conflict_message 出力 nvarchar(512) 競合がログに記録される場合に、解決方法について表示するメッセージ。
    @destowner sysname サブスクライバー側でパブリッシュされたテーブルの所有者。

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

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

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

  1. sp_addmergearticle を実行してアーティクルを定義します。

  2. @article_resolver パラメーターに対して、MicrosoftSQLサーバー ストアド プロシージャ競合回避モジュール の値を指定します。

  3. @resolver_info パラメーターに対して、競合回避ロジックを実装するストアド プロシージャの名前を指定します。

    詳しくは、「アーティクルの定義」をご覧ください。

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

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

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

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

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

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

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

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

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

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

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

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

    カスタム競合回避モジュールは、プル サブスクリプションの場合はサブスクライバーに、プッシュ サブスクリプションの場合はディストリビューターに、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_assembly には false の値を指定します。

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

  10. (省略可) クラスターで手順 6 から 9 を繰り返して、クラスターの全ノードにカスタム競合回避モジュールを登録します。 これらの手順は、フェールオーバー後にカスタム リゾルバーがリコンサイラーを正しく読み込めるようにするために必要です。

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

  1. パブリッシャーで sp_enumcustomresolvers (Transact-SQL) を実行し、目的の競合回避モジュールの表示名をメモします。

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

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

  1. パブリッシャーにおいて sp_enumcustomresolvers (Transact-SQL) を実行し、目的のリゾルバーの表示名を控えておきます。

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