パブリッシャーとサブスクライバーが接続され、同期が行われると、マージ エージェントは競合があるかどうかを検出します。 競合が検出された場合、マージ エージェントは競合回避モジュール (アーティクルがパブリケーションに追加されるときに指定されます) を使用して、受け入れられ、他のサイトに伝達されるデータを決定します。
注
サブスクライバーはパブリッシャーと同期しますが、通常、サブスクライバーとパブリッシャーで行われる更新ではなく、異なるサブスクライバーで行われた更新の間で競合が発生します。
競合の検出と解決の動作は、このトピックで説明する次のオプションによって異なります。
列レベルの追跡、行レベルの追跡、または論理レコード レベルの追跡を指定するかどうか。
既定の優先度ベースの解決メカニズムを指定するか、アーティクル リゾルバーを指定するか。 アーティクル リゾルバーは次のようになります。
マネージド コードで記述された ビジネス ロジック ハンドラー 。
COM ベースの カスタム 競合回避モジュール。
Microsoft が提供する COM ベースの競合回避モジュール。
既定の解決メカニズムを使用する場合、動作は、使用されるサブスクリプションの種類 (クライアントまたはサーバー) によってさらに決定されます。
競合の検出
データ変更が競合として適格かどうかは、記事に設定した競合追跡の種類によって異なります。
列レベルの競合追跡を選択した場合、複数のレプリケーション ノードで同じ行の同じ列に変更が加えられた場合、競合と見なされます。
行レベルの追跡を選択した場合、複数のレプリケーション ノードで同じ行の列に変更が加えられた場合は競合と見なされます (対応する行の影響を受ける列は同じである必要はありません)。
論理レコード レベルの追跡を選択した場合、複数のレプリケーション ノードで同じ論理レコード内の行に変更が加えられた場合は競合と見なされます (対応する行の影響を受ける列は同じである必要はありません)。
詳細については、「 論理レコードの競合の検出と解決」を参照してください。
アーティクルの競合追跡と解決レベルを指定するには、「 マージ アーティクルの競合追跡と解決レベルの指定」を参照してください。
競合の解決
競合が検出されると、マージ エージェントは選択した競合回避モジュールを起動し、競合回避モジュールを使用して競合の勝者を特定します。 勝利行はパブリッシャーとサブスクライバーに適用され、敗北行のデータは競合テーブルに書き込まれます。 競合を対話形式で解決することを選択しない限り、競合はリゾルバーの実行直後に解決されます。
リゾルバーの種類
マージ レプリケーションでは、競合の解決はアーティクル レベルで行われます。 複数のアーティクルで構成されるパブリケーションの場合は、異なるアーティクルを処理する異なる競合回避モジュールを使用することも、同じ競合回避モジュールを 1 つのアーティクル、複数のアーティクル、またはパブリケーションを構成するすべてのアーティクルを提供することもできます。
既定の優先度ベースの競合回避モジュールを使用する場合は、アーティクルのリゾルバー プロパティを設定する必要はありません。 既定のリゾルバーではなくアーティクル リゾルバーを使用する場合は、パブリッシャーで使用可能なリゾルバーを選択して、それを使用するアーティクルのリゾルバー プロパティを設定する必要があります。 リゾルバーに渡す必要がある特定の情報は、リゾルバー情報プロパティで指定することもできます。
マージ レプリケーションには、次の 4 種類の競合回避モジュールが用意されています。
既定の優先度ベースの競合回避モジュール
既定の解決メカニズムの動作は、サブスクリプションがクライアント サブスクリプションかサーバー サブスクリプションかに応じて異なります。 サーバー サブスクリプションを使用する個々のサブスクライバーに優先順位の値を割り当てます。優先順位が最も高いノードで行われた変更は、競合に対して優先されます。 クライアント サブスクリプションの場合、パブリッシャーに書き込まれた最初の変更が競合を優先します。
サブスクリプションを作成した後は、ある種類から別の種類に変更することはできません。
ビジネス ロジック ハンドラー
ビジネス ロジック ハンドラー フレームワークを使用すると、マージ同期プロセス中に呼び出されるマネージド コード アセンブリを記述できます。 アセンブリには、同期中に競合やその他の多くの条件に対応できるビジネス ロジックが含まれています。 詳細については、「 マージ同期中のビジネス ロジックの実行」を参照してください。
COM ベースのカスタム 競合回避モジュール
マージ レプリケーションには、Microsoft Visual C++ や Microsoft Visual Basic などの言語で COM オブジェクトとしてリゾルバーを記述するための API が用意されています。 詳細については、「COM-Based カスタムリゾルバー」を参照してください。
Microsoft が提供する COM ベースの競合回避モジュール
Microsoft SQL Server には、COM ベースのリゾルバーが多数含まれています。 詳細については、「 Microsoft COM-Based Resolvers」を参照してください。
適切な種類のリゾルバーを選択する方法については、「リゾルバーの 選択」を参照してください。
注
一部の記事リゾルバーは、特定の操作に対してのみ競合を処理するように記述されています。 たとえば、リゾルバーは更新を処理できますが、挿入や削除は処理しません。 既定の優先度ベースの競合回避モジュールは、アーティクル 競合回避モジュールによって処理されない競合を処理します。
マージ サブスクリプションの種類と競合解決の優先順位を指定するには、次を参照してください。
SQL Server Management Studio: マージ サブスクリプションの種類と競合解決の優先順位を指定する (SQL Server Management Studio)
レプリケーション Transact-SQL プログラミングとレプリケーション管理オブジェクト (RMO) プログラミング: プル サブスクリプションの作成 と プッシュ サブスクリプションの作成
対話型リゾルバー
レプリケーションには、既定の優先度ベースの競合回避モジュールまたはアーティクル 競合回避モジュールと組み合わせて使用できる対話型リゾルバー ユーザー インターフェイスが用意されています。 Microsoft Windows 同期マネージャーを使用してオンデマンド同期を実行する場合、対話型リゾルバーは実行時に競合データを表示し、競合を解決する方法を選択できます。 対話型解決を有効にして対話型競合回避モジュールを起動する方法の詳細については、「 対話型競合解決」を参照してください。
競合の表示
競合を表示する最も簡単な方法は、SQL Server Management Studio から入手できるレプリケーション競合ビューアーを使用することです (SQL Server には、競合テーブルのクエリを実行できるストアド プロシージャも用意されています)。 競合ビューアーと対話型競合回避モジュールは同様のツールですが、対話型リゾルバーを使用すると、同期が発生したときに競合を解決できます。一方、競合ビューアーは、競合が解決された後に表示されるように設計されています。 競合メタデータがシステム テーブルで引き続き使用できる場合 (競合メタデータは既定で 14 日間保持されます)、競合ビューアーで競合解決の結果をオーバーライドできますが、直接の介入が定期的に必要な場合は、対話型リゾルバーの使用を検討してください。
注
論理レコードを含む競合は、競合ビューアーに表示されません。 これらの競合に関する情報を表示するには、レプリケーション ストアド プロシージャを使用します。 詳細については、「 マージ パブリケーションの競合情報の表示 (レプリケーション Transact-SQL プログラミング)」を参照してください。
競合ビューアーには、次の 3 つのシステム テーブルからの情報が表示されます。
レプリケーションでは、マージ アーティクル内の各テーブルの競合テーブルが作成され、名前 は MSmerge_conflict_<PublicationName>_<ArticleName> の形式で作成されます。
競合テーブルの構造は、基になっているテーブルと同じです。 これらのテーブルの 1 つの行は、競合行の失われるバージョンで構成されます (行の優先バージョンは実際のユーザー テーブルにあります)。
MSmerge_conflicts_info テーブルには、競合の種類など、各競合に関する情報が表示されます。
sysmergearticles テーブルは、競合テーブルを持つユーザーテーブルを特定し、その競合テーブルについての情報を提供します。
既定では、競合情報が保存されます。
パブリッシャーとサブスクライバーで、パブリケーション互換性レベルが 90RTM 以上の場合。
パブリケーションの互換性レベルが 80RTM より低い場合は、パブリッシャーで。
サブスクライバーが SQL Server Compact を実行している場合はパブリッシャーで。 SQL Server Compact サブスクライバーに競合データを格納することはできません。
競合を表示するには
SQL Server Management Studio: マージ パブリケーションのデータ競合の表示と解決 (SQL Server Management Studio)
レプリケーション Transact-SQL プログラミング: マージ パブリケーションの競合情報を表示する (レプリケーション Transact-SQL プログラミング)