マージ アーティクルに対してストアド プロシージャ ベースのカスタム競合回避モジュールを実装する方法 (レプリケーション Transact-SQL プログラミング)
各パブリッシャで、固有のカスタム競合回避モジュールを Transact-SQL ストアド プロシージャとして記述できます。同期中に、このストアド プロシージャは、競合回避モジュールが登録されているアーティクル内で競合が発生した場合に呼び出されます。競合する行の情報は、マージ エージェントによってプロシージャの必須パラメータに渡されます。ストアド プロシージャ ベースのカスタム競合回避モジュールは、常にパブリッシャで作成されます。
注意 |
---|
MicrosoftSQL Server ストアド プロシージャの競合回避モジュールは、行の変更ベースの競合を処理するためにのみ呼び出されます。このモジュールは、他の種類の競合 (PRIMARY KEY 違反による挿入の失敗や一意インデックス制約違反) の処理には使用できません。 |
ストアド プロシージャ ベースのカスタム競合回避モジュールを作成するには
パブリッシャのパブリケーションまたは 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
サブスクライバ側でパブリッシュされたテーブルの所有者。
このストアド プロシージャは、マージ エージェントからパラメータに渡された値を使用して、カスタム競合回避ロジックを実装します。このロジックでは、ベース テーブルと同じ構造を持ち、競合で優先されたバージョンの行のデータ値を含んでいる、単一行の結果セットを返す必要があります。
サブスクライバでパブリッシャへの接続に使用される任意のログインに対して、ストアド プロシージャの EXECUTE 権限を許可します。
新しいテーブル アーティクルにカスタム競合回避モジュールを使用するには
- @article_resolver パラメータに MicrosoftSQL Server Stored Procedure Resolver の値を、@resolver_info パラメータに競合回避ロジックを実装するストアド プロシージャの名前を指定し、sp_addmergearticle を実行してアーティクルを定義します。詳細については、「アーティクルを定義する方法 (レプリケーション Transact-SQL プログラミング)」を参照してください。
既存のテーブル アーティクルにカスタム競合回避モジュールを使用するには
@publication と @article を指定し、@property に article_resolver の値を、@value に MicrosoftSQL Server Stored ProcedureResolver の値を指定して、sp_changemergearticle を実行します。
@publication と @article を指定し、@property に resolver_info の値を、@value に競合回避ロジックを実装するストアド プロシージャの名前を指定して、sp_changemergearticle を実行します。