マージ アーティクル競合回避モジュールの指定
このトピックでは、SQL Server Management Studioまたは Transact-SQL を使用して、SQL Server 2014 でマージ アーティクル リゾルバーを指定する方法について説明します。
このトピックの内容
作業を開始する準備:
マージ アーティクル競合回避モジュールを指定するために使用するもの:
はじめに
推奨事項
マージ レプリケーションでは、以下の競合回避モジュールが使用できます。
既定の競合回避モジュール。 既定の競合回避モジュールの動作は、サブスクリプションがクライアント サブスクリプションまたはサーバー サブスクリプションのどちらであるかによって異なります。 サブスクリプションの種類の指定の詳細については、「マージ サブスクリプションの種類と競合解決の優先度を指定する (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 ベースのリゾルバーの場合は、dll の CLSID を@resolver_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\120\COM ディレクトリにあります。
regsvr32.exe を使用して、カスタム競合回避モジュール DLL をオペレーティング システムに登録します。 たとえば、次のコマンドをコマンド プロンプトから実行すると、 SQL Server Additive Conflict Resolver が登録されます。
regsvr32 ssradd.dll
リゾルバーがビジネス ロジック ハンドラーの場合は、マージ エージェント実行可能ファイル (replmerg.exe) と同じフォルダー、マージ エージェントを呼び出すアプリケーションと同じフォルダー、または手順 3 で@dotnet_assembly_name パラメーターに指定されたフォルダーにアセンブリを展開します。
注意
マージ エージェント実行可能ファイルの既定のインストール場所は C:\Program Files\Microsoft SQL Server\120\COM です。
マージ アーティクルを定義するときにカスタム競合回避モジュールを指定するには
カスタム競合回避モジュールを使用する場合は、上記の手順に従って競合回避モジュールを作成および登録します。
パブリッシャーで 、sp_enumcustomresolvers (Transact-SQL) を 実行し、目的のカスタム リゾルバーの名前を結果セットの 値 フィールドにメモします。
パブリッシャー側のパブリケーション データベースで、 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) を 実行し、目的のカスタム リゾルバーの名前を結果セットの 値 フィールドにメモします。
パブリッシャー側のパブリケーション データベースで、 sp_changemergearticle (Transact-SQL) を実行します。 @propertyのビジネス ロジック ハンドラーの完全パス、@valueの手順 2 の目的のカスタム リゾルバーの名前など、article_resolverの値を指定します。
カスタム リゾルバーに必要な入力を変更するには、 sp_changemergearticle (Transact-SQL) をもう一度実行します。 @propertyにresolver_infoの値と、@valueのカスタム リゾルバーに必要な入力を指定します。 ストアド プロシージャ ベースのカスタム リゾルバーの 場合、@resolver_info はストアド プロシージャの名前です。 必須入力の詳細については、「Microsoft COM ベースの競合回避モジュール」を参照してください。
カスタム競合回避モジュールの登録を解除するには
パブリッシャーで 、sp_enumcustomresolvers (Transact-SQL) を 実行し、結果セットの 値 フィールドで削除するカスタム リゾルバーの名前をメモします。
ディストリビューターで sp_unregistercustomresolver (Transact-SQL) を実行します。 手順 1 のカスタム リゾルバーの完全な名前を @article_resolverに指定します。
例 (Transact-SQL)
次の例では、新しいアーティクルを作成し、競合が発生したときに SQL Server UnitPrice 列の平均の計算に 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
次の例では、アーティクルを変更して、競合が発生したときに SQL Server UnitsOnOrder 列の合計の計算に 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