次の方法で共有


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

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

このトピックの内容

  • マージ アーティクルのカスタム競合回避モジュールを実装するためにに使用するもの:

    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 OUTPUT

    int

    競合を後で解決できるように、マージ処理で競合をログに記録するかどうかを指定します。

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

    1 = サブスクライバーは競合で優先されない。

    2 = パブリッシャーは競合で優先されない。

    @conflict_message OUTPUT

    nvarchar(512)

    競合をログに記録する場合の解決に関するメッセージ。

    @destowner

    sysname

    サブスクライバー側でパブリッシュされたテーブルの所有者。

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

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

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

  • @article_resolver パラメーターに MicrosoftSQL Server ストアド プロシージャ競合回避モジュール の値を、@resolver_info パラメーターに競合回避ロジックを実装するストアド プロシージャの名前を指定し、sp_addmergearticle を実行してアーティクルを定義します。 詳細については、「アーティクルの定義」を参照してください。

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

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

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

[トップに戻る] リンクで使用される矢印アイコン[先頭に戻る]

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

Microsoft.SqlServer.Replication.BusinessLogicSupport 名前空間により実装されるインターフェイスを利用して、マージ レプリケーション同期処理で発生するイベントを処理し、競合を回避するための複雑なビジネス ロジックを作成できます。 詳細については、「マージ アーティクルのビジネス ロジック ハンドラーの実装」を参照してください。また、ネイティブ コード ベースのカスタム ビジネス ロジックを独自に作成して、競合を回避することもできます。 Microsoft 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) を実行します。 COM オブジェクトの表示名を @article_resolver に指定し、ライブラリの ID (CLSID) を @resolver_clsid に指定し、false を @is_dotnet_assembly に指定します。

    注意

    カスタム競合回避モジュールが不要になれば、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 を指定し、article_resolver@property に指定し、手順 1. で調べたアーティクル競合回避モジュールの表示名を @value に指定します。

[トップに戻る] リンクで使用される矢印アイコン[先頭に戻る]

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

  1. SQL Server 2000 サンプル ファイルにサンプルが提供されています。 「SQL Server 2000 Service Pack 3 用の更新されたサンプル」から sql2000samples.cab をダウンロードします。 これによって、合計 6.9 MB の 8 つのファイルがダウンロードされます。

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

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

    注意

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

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

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

    注意

    サンプルの 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 に置き換えます。

関連項目

概念

マージ レプリケーションの競合検出および解決の詳細

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

レプリケーション セキュリティの推奨事項