マージ アーティクル競合回避モジュールの指定
適用対象: SQL Server
このトピックでは、SQL Server Management Studio または Transact-SQL を使用して、SQL Server で統合アーティクルリゾルバーを指定する方法について説明します。
推奨事項
マージ レプリケーションでは、以下の競合回避モジュールが使用できます。
既定の競合回避モジュール。 既定の競合回避モジュールの動作は、サブスクリプションがクライアント サブスクリプションまたはサーバー サブスクリプションのどちらであるかによって異なります。 サブスクリプションの種類の指定について詳しくは、「統合 サブスクリプションの種類と競合の解決の優先度の指定 (SQL Server Management Studio)」をご覧ください。
ユーザーの作成したカスタム競合回避モジュール。ビジネス ロジック ハンドラー (マネージド コードで作成) または COM ベースのカスタム競合回避モジュールです。 詳細については、「 マージ レプリケーションの競合検出および解決の詳細」を参照してください。 競合する行だけでなく、レプリケートされた各行に対して実行するカスタム ロジックを実装する必要がある場合は、「 マージ アーティクルのビジネス ロジック ハンドラーの実装を使用して、マージ アーティクル競合回避モジュールを指定する方法について説明します。
標準の COM ベースリゾルバー。 Microsoft SQL Server に含まれています。
既定以外の競合回避モジュールを使用する場合は、マージ エージェントが動作しているコンピューターにそのモジュールをコピーして登録する必要があります (ビジネス ロジック ハンドラーを使用している場合は、そのビジネス ロジック ハンドラーもパブリッシャー側で登録する必要があります)。 マージ エージェントは、以下の場所で実行されます。
プッシュ サブスクリプションの場合はディストリビューター
プル サブスクリプションの場合はサブスクライバー
Web 同期を使用するプル サブスクリプションの場合は Microsoft インターネット インフォメーション サービス (IIS) サーバー
SQL Server Management Studio を使用する
リゾルバーを登録した後、[アーティクルのプロパティ - <アーティクル]> ダイアログ ドロップダウン リストの [リゾルバー] タブでアーティクルがリゾルバーを使用するように指定します。このダイアログ ドロップダウン リストは、パブリケーションの新規作成ウィザードおよび [パブリケーションのプロパティ - <パブリケーション]> ダイアログ ドロップダウン リストから使用できます。 ウィザードの使用およびダイアログ ボックスへのアクセスの詳細については、「パブリケーションの作成」および「View and Modify Publication Properties」 (パブリケーション プロパティの表示および変更) を参照してください。
競合回避モジュールを指定するには
パブリケーションの新規作成ウィザードの [アーティクル] ページまたは [パブリケーションのプロパティ - <パブリケーション]> ダイアログ ドロップダウン リストで、テーブルを選択します。
[アーティクルのプロパティ]をクリックしてから、 [反転表示されたテーブル アーティクルのプロパティを設定]をクリックします。
[アーティクルのプロパティ - <アーティクル]> ページで、[リゾルバー] タブをクリックします。
[ディストリビューターに登録されたカスタム競合回避モジュールを使用する]を選択し、一覧から競合回避モジュールをクリックします。
競合回避モジュールが入力 (列名など) を必要とする場合は [競合回避モジュールが必要とする情報の入力] ボックスで指定します。
[OK] を選択します。
競合回避モジュールを必要とする各アーティクルについて、この処理を繰り返します。
Transact-SQL の使用
カスタム競合回避モジュールを登録するには
固有のカスタム競合回避モジュールを登録する場合は、次のいずれかの種類を作成します。
ビジネス ロジック ハンドラーとしてのマネージド コード ベースの競合回避モジュール。 詳細については、「 マージ アーティクルのビジネス ロジック ハンドラーの実装」を参照してください。
ストアド プロシージャ ベースの競合回避モジュールと 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 をオーバーライドするクラスの完全修飾名を指定します。
Note
マージ エージェント実行可能ファイルがあるディレクトリ、マージ エージェントを同期的に起動するアプリケーションがあるディレクトリ、およびグローバル アセンブリ キャッシュ (GAC) の、いずれとも異なる場所にビジネス ロジック ハンドラー アセンブリが配置されている場合は、 @dotnet_assembly_nameにアセンブリ名を含む完全なパスを指定する必要があります。
競合回避モジュールが COM ベースの場合
カスタム競合回避モジュール DLL をプッシュ サブスクリプションのディストリビューター、またはプル サブスクリプションのサブスクライバーにコピーします。
Note
Microsoft カスタム リゾルバーは、C:\Program Files\Microsoft SQL Server\nnn\COM ディレクトリにあります。
regsvr32.exe を使用して、カスタム競合回避モジュール DLL をオペレーティング システムに登録します。 たとえば、次のコマンドをコマンド プロンプトから実行すると、以下の SQL Server Additive 競合回避モジュール が登録されます。
regsvr32 ssradd.dll
競合回避モジュールがビジネス ロジック ハンドラーである場合は、マージ エージェント実行可能ファイル (replmerg.exe) と同じフォルダー、マージ エージェントを起動するアプリケーションと同じフォルダー、または手順 3. で @dotnet_assembly_name パラメーターに指定したフォルダーのいずれかにアセンブリを配置します。
Note
マージ エージェント実行可能ファイルの既定のインストール場所は C:\Program Files\Microsoft SQL Server\nnn\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. のカスタム競合回避モジュールの完全な名前を指定します。
例 (Transact-SQL)
次の例では、新しいアーティクルを作成し、競合が発生したときに UnitPrice 列の平均の計算に SQL Server Averaging 競合回避モジュール が使用されるように指定します。
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 競合回避モジュール が使用されるように指定します。
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