マージ アーティクル競合回避モジュールを指定する方法 (レプリケーション Transact-SQL プログラミング)
マージ パブリケーションのアーティクルを定義するときに、カスタム競合回避モジュールを指定できます。詳細については、「マージ レプリケーションの競合検出および解決の詳細」を参照してください。Microsoft SQL Server には定義済みカスタム競合回避モジュールがいくつか用意されていますが、自分で記述することもできます。競合する行だけでなく、レプリケートされた各行に対して実行するカスタム ロジックを実装する必要がある場合は、「マージ アーティクルのビジネス ロジック ハンドラを実装する方法 (レプリケーション プログラミング)」を参照してください。
カスタム競合回避モジュールを登録するには
固有のカスタム競合回避モジュールを登録する場合は、次のいずれかの種類を作成します。
ビジネス ロジック ハンドラとしてのマネージ コード ベースの競合回避モジュール。詳細については、「マージ アーティクルのビジネス ロジック ハンドラを実装する方法 (レプリケーション プログラミング)」を参照してください。
ストアド プロシージャ ベースの競合回避モジュール。詳細については、「マージ アーティクルに対してストアド プロシージャ ベースのカスタム競合回避モジュールを実装する方法 (レプリケーション Transact-SQL プログラミング)」を参照してください。
COM ベースの競合回避モジュール。詳細については、「マージ アーティクル用の COM ベース カスタム競合回避モジュールを実装する方法 (レプリケーションのプログラミング)」を参照してください。
目的の競合回避モジュールが既に登録されているかを判断するには、パブリッシャの任意のデータベースに対して sp_enumcustomresolvers (Transact-SQL) を実行します。これにより、カスタム競合回避モジュールの説明、およびディストリビュータに登録された各 COM ベースの競合回避モジュールのクラス識別子 (LSID)、またはディストリビュータに登録された各ビジネス ロジック ハンドラのマネージ アセンブリの情報が表示されます。
目的のカスタム競合回避モジュールがまだ登録されていない場合は、ディストリビュータで sp_registercustomresolver (Transact-SQL) を実行します。@article_resolver に競合回避モジュールの名前を指定します。ビジネス ロジックの場合はアセンブリの表示名です。COM ベースの競合回避モジュールの場合は、@resolver_clsid に DLL の CLSID を指定し、ビジネス ロジック ハンドラの場合は、@is_dotnet_assembly に true、@dotnet_assembly_name にアセンブリの名前、@dotnet_class_name に BusinessLogicModule をオーバーライドするクラスの完全修飾名を指定します。
注 マージ エージェント実行可能ファイルがあるディレクトリ、マージ エージェントを同期的に起動するアプリケーションがあるディレクトリ、およびグローバル アセンブリ キャッシュ (GAC) の、いずれとも異なる場所にビジネス ロジック ハンドラ アセンブリが配置されている場合は、@dotnet_assembly_name にアセンブリ名を含む完全なパスを指定する必要があります。
競合回避モジュールが COM ベースの場合
カスタム競合回避モジュール DLL をプッシュ サブスクリプションのディストリビュータ、またはプル サブスクリプションのサブスクライバにコピーします。
注 Microsoft カスタム競合回避モジュールは、C:\Program Files\Microsoft SQL Server\100\COM ディレクトリにあります。
regsvr32.exe を使用して、カスタム競合回避モジュール DLL をオペレーティング システムに登録します。たとえば、次のコマンドをコマンド プロンプトから実行すると、SQL Server Additive Conflict Resolver が登録されます。
regsvr32 ssradd.dll
競合回避モジュールがビジネス ロジック ハンドラである場合は、マージ エージェント実行可能ファイル (replmerg.exe) と同じフォルダ、マージ エージェントを起動するアプリケーションと同じフォルダ、または手順 3. で @dotnet_assembly_name パラメータに指定したフォルダのいずれかにアセンブリを配置します。
注 マージ エージェント実行可能ファイルの既定のインストール場所は、C:\Program Files\Microsoft SQL Server\100\COM です。
マージ アーティクルを定義するときにカスタム競合回避モジュールを指定するには
カスタム競合回避モジュールを使用する場合は、上記の手順に従って競合回避モジュールを作成および登録します。
パブリッシャで、sp_enumcustomresolvers (Transact-SQL) を実行し、結果セットの value フィールドに示された目的のカスタム競合回避モジュールの名前を確認します。
パブリッシャ側のパブリケーション データベースに対して、sp_addmergearticle (Transact-SQL) を実行します。@article_resolver に手順 2. の競合回避モジュールの名前を指定し、@resolver_info パラメータを使ってカスタム競合回避モジュールの必須入力をすべて指定します。ストアド プロシージャ ベースのカスタム競合回避モジュールの場合、@resolver_info はストアド プロシージャの名前です。Microsoft によって提供される競合回避モジュールの必須入力の詳細については、「Microsoft COM ベースの競合回避モジュール」を参照してください。
既存のマージ アーティクルに対するカスタム競合回避モジュールを指定または変更するには
アーティクルに対してカスタム競合回避モジュールが定義されているかどうかを判断するには、sp_helpmergearticle (Transact-SQL) を実行します。アーティクルに対してカスタム競合回避モジュールが定義されている場合は、article_resolver フィールドに名前が表示されます。競合回避モジュールに対するすべての入力が結果セットの resolver_info フィールドに表示されます。
パブリッシャで、sp_enumcustomresolvers (Transact-SQL) を実行し、結果セットの value フィールドに示された目的のカスタム競合回避モジュールの名前を確認します。
パブリッシャ側のパブリケーション データベースに対して、sp_changemergearticle (Transact-SQL) を実行します。@property にビジネス ロジック ハンドラの完全パスを含む article_resolver を、@value に手順 2. の目的のカスタム競合回避モジュールの名前を指定します。
カスタム競合回避モジュールの必須入力を変更するには、sp_changemergearticle (Transact-SQL) を再度実行します。@property に resolver_info を、@value にカスタム競合回避モジュールの必須入力を指定します。ストアド プロシージャ ベースのカスタム競合回避モジュールの場合、@resolver_info はストアド プロシージャの名前です。必要な入力の詳細については、「Microsoft COM ベースの競合回避モジュール」を参照してください。
カスタム競合回避モジュールの登録を解除するには
パブリッシャで sp_enumcustomresolvers (Transact-SQL) を実行し、結果セットの value フィールドに示された、削除するカスタム競合回避モジュールの名前を確認します。
ディストリビュータで sp_unregistercustomresolver (Transact-SQL) を実行します。@article_resolver に、手順 1. のカスタム競合回避モジュールの完全な名前を指定します。
使用例
次の例では、新しいアーティクルを作成し、競合が発生したときに UnitPrice 列の平均の計算に SQL Server Averaging Conflict Resolver が使用されるように指定します。
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 Conflict Resolver が使用されるように指定します。
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