適用対象:SQL Server
この記事では、SQL Server Management Studio または Transact-SQL を使って SQL Server でマージ記事リゾルバを指定する方法について説明します。
推奨事項
マージレプリケーションは以下の種類の記事リゾルバをサポートしています:
既定の競合回避モジュール。 既定の競合回避モジュールの動作は、サブスクリプションがクライアント サブスクリプションまたはサーバー サブスクリプションのどちらであるかによって異なります。 購読タイプの指定についての詳細は、「 Combine Subscription TypeとReference Resolution Priority(結合サブスクリプションタイプおよび競合解決優先度)」をご覧ください。
あなたが書くカスタムリゾルバで、マネージドコードで書かれたビジネスロジックハンドラでも、カスタムCOMベースのリゾルバでも構いません。 詳細については、「 高度なマージレプリケーション - 競合検出と解決」をご覧ください。 競合する行だけでなく、各レプリケート行ごとに実行するカスタムロジックを実装する必要がある場合は、「 Merge ArticleのBusiness Logic Handlerを実装」を参照してください。
標準的なCOMベースのリゾルバで、SQL Serverに含まれています。
デフォルトのリゾルバ以外のリゾルバを使用するには、マージ エージェントが動作するコンピュータにリゾルバをコピーし、登録する必要があります。 ビジネスロジックハンドラを使用している場合は、Publisherにも登録する必要があります。 マージ エージェントは、以下の場所で実行されます。
プッシュ サブスクリプションの場合はディストリビューター
プル サブスクリプションの場合はサブスクライバー
インターネット インフォメーション サービス(IIS)サーバーは、ウェブ同期を利用するプルサブスクリプションを用いています
SQL Server Management Studio を使用します。
リゾルバーを登録した後、記事プロパティーズ<Article>ダイアログボックスのリゾルバタブでリゾルバを使用するよう指定してください。 このダイアログボックスは、新しい出版ウィザードおよび 出版プロパティ - <Publication> ダイアログボックスでアクセスできます。 ウィザードの使用方法やダイアログボックスへのアクセスについては、「 出版物を作成 」および「 出版物プロパティの表示および修正」をご覧ください。
パブリケーションの新規作成ウィザードの [アーティクル] ページまたは [パブリケーションのプロパティ - <パブリケーション]> ダイアログ ドロップダウン リストで、テーブルを選択します。
記事プロパティを選択し、次に「ハイライトされたテーブル記事のプロパティセット」を選択します。
記事のプロパティ - <Article>ページで、リゾルバタブを選択してください。
「 Distributorに登録されたカスタムリゾルバを使える」を選択し、リストからリゾルバを選択します。
リゾルバが入力(例えばカラム名)を必要とする場合は、リ ゾルバ のテキストボックスに必要な入力情報に入力してください。
[OK] を選択します。
競合回避モジュールを必要とする各アーティクルについて、この処理を繰り返します。
Transact-SQL を使用する
固有のカスタム競合回避モジュールを登録する場合は、次のいずれかの種類を作成します。
ビジネス ロジック ハンドラーとしてのマネージド コード ベースの競合回避モジュール。 詳細については、「 マージ アーティクルのビジネス ロジック ハンドラーの実装」を参照してください。
ストアド プロシージャ ベースの競合回避モジュールと COM-ベースの競合回避モジュール。 詳細については、 マージ記事の「Implementing a custom conflict resolver」をご覧ください。
目的のリゾルバがすでに登録されているかを確認するには、任意のデータベースのPublisherでsp_enumcustomresolversを実行します。 この手続きはカスタムリゾルバの記述、ディストリビュータに登録された各COMベースリゾルバのクラス識別子(CLSID)、およびディストリビュータに登録された各ビジネスロジックハンドラのマネージドアセンブリ情報を返します。
もし希望するカスタムリゾルバがまだ登録されていなければ、ディストリビューターで sp_registercustomresolver を実行します。
@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
<drive>:\Program Files\Microsoft SQL Server\<nnn>\COMディレクトリにあります。regsvr32.exeを使ってカスタムリゾルバのDLLをオペレーティングシステムに登録してください。 例えば、以下のコマンドはSQL Serverの加法衝突解決器を登録します:regsvr32 ssradd.dll
リゾルバがビジネスロジックハンドラーの場合は、マージ エージェント実行ファイル(replmerg.exe)と同じフォルダにアセンブリを展開します。マージ エージェントを呼び出すアプリケーションと同じフォルダ、またはステップ3で
@dotnet_assembly_nameパラメータ指定のフォルダに配置してください。Note
マージ エージェント実行ファイルのデフォルトのインストール場所は
<drive>:\Program Files\Microsoft SQL Server\<nnn>\COMです。
マージ アーティクルを定義するときのカスタム競合回避モジュールの指定
カスタムコンフリュバリゾルバを使用する予定がある場合は、前述の手順に従ってリゾルバを作成・登録してください。
Publisherでsp_enumcustomresolversを実行し、結果セットの
valueフィールドに希望するカスタムリゾルバの名前をメモします。パブリッシャー側のパブリケーション データベースで、 sp_addmergearticleを実行します。
@article_resolverのステップ2でリゾルバの名前とカスタムリゾルバへの必要な入力を@resolver_infoパラメータで指定します。 ストアドプロシージャベースのカスタムリソルバーの場合、@resolver_infoはストアドプロシージャの名前です。 Microsoftが提供するリゾルバに必要な入力についての詳細は、「高度なマージレプリケーションの競合 - COM-Based リゾルバー」をご覧ください。
既存のマージ アーティクルに対するカスタム競合回避モジュールの指定または変更
記事にカスタムリゾルバが定義されているか、またはリゾルバの名前を取得するために、 sp_helpmergearticleを実行します。 記事用にカスタムリゾルバが定義されている場合、その名前は
article_resolverフィールドに表示されます。resolver_infoフィールドはリゾルバに供給された任意の入力を示します。Publisherでsp_enumcustomresolversを実行し、結果セットの
valueフィールドに希望するカスタムリゾルバの名前をメモします。パブリッシャー側のパブリケーション データベースで、 sp_changemergearticleを実行します。
@propertyのビジネスロジックハンドラの全パスを含むarticle_resolverの値、@valueの目的のカスタムリゾルバの名前を指定します。カスタムリゾルバに必要な入力を変更するには、再度 sp_changemergearticle を実行します。
@propertyの値はresolver_info、カスタムリゾルバへの必要な入力は@valueに指定します。 ストアドプロシージャベースのカスタムリソルバーの場合、@resolver_infoはストアドプロシージャの名前です。 必要な入力の詳細については、「 Advanced Merge Replication Conflict - COM-Based Resolvers」をご覧ください。
カスタム競合回避モジュールの登録の解除
Publisherでsp_enumcustomresolversを実行し、結果セットの
valueフィールドに削除すべきカスタムリゾルバの名前をメモしてください。ディストリビューターで、 sp_unregistercustomresolverを処刑しろ。
@article_resolverのため、ステップ1で使ったカスタムリゾルバのフルネームを指定します。
例 (Transact-SQL)
この例は新しい記事を作成し、SQL Server平均化紛争解決ツールを使って対立が発生した場合のUnitPrice列の平均を計算することを指定しています。
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