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