マージ レプリケーションの概要

一般にマージ レプリケーションは、トランザクション レプリケーションと同様に、パブリケーションのデータベース オブジェクトとデータのスナップショットで開始されます。その後にパブリッシャーとサブスクライバーで行われたデータおよびスキーマの変更は、トリガーを使って追跡されます。サブスクライバーは、ネットワークに接続されたときにパブリッシャーと同期して、前回の同期以降にパブリッシャーとサブスクライバーの間で変更されたすべての行を交換します。

マージ レプリケーションは、一般にサーバー対クライアント環境で使用されます。マージ レプリケーションは、以下の状況に適しています。

  • 複数のサブスクライバーで別々の時刻に同じデータを更新し、それらの変更をパブリッシャーや他のサブスクライバーに反映する場合がある。

  • サブスクライバーで、データを受信し、オフラインで変更を行い、後でパブリッシャーおよび他のサブスクライバーと変更を同期する必要がある。

  • 各サブスクライバーが、データの別々の部分を必要とする。

  • 競合が発生する可能性があり、発生した場合にはそれを検出して解決できる必要がある。

  • アプリケーションで、中間状態のデータにアクセスするのではなく、最終的な変更結果が必要である。たとえば、サブスクライバーでパブリッシャーと同期する前に行が 5 回変更された場合、最終的な変更結果 (つまり、5 回目の値) を反映させるために、パブリッシャーでは 1 回だけ変更されます。

マージ レプリケーションでは、さまざまなサイトが自律的に動作し、更新内容が後で 1 つにマージされます。更新は複数のノードで発生するため、パブリッシャーおよび複数のサブスクライバーで同じデータが更新されている場合があります。したがって、更新をマージする際に競合が発生する可能性があるため、マージ レプリケーションには競合を処理するいくつかの方法が用意されています。

変更を追跡するため、マージ レプリケーション (とキュー更新サブスクリプションを使用したトランザクション レプリケーション) では、パブリッシュされたすべてのテーブルのすべての行を一意に識別できる必要があります。このマージ レプリケーションを実現するには、列 rowguid をすべてのテーブルに追加します。ただし、データ型が uniqueidentifier で ROWGUIDCOL プロパティが設定されている列が、テーブルに既にある場合は除きます (このような列がある場合は、その列が使用されます)。テーブルがパブリケーションから削除されると、rowguid 列も削除されます。既存の列を追跡に使用していた場合、その列は削除されません。レプリケーションで行を識別するために使用される rowguidcol はフィルターに含めないでください。newid() 関数は、rowguid 列に既定値として指定されますが、顧客は必要に応じて、各行に guid を指定できます。ただし、値 00000000-0000-0000-0000-000000000000 を指定しないでください。

マージ レプリケーションの実装については、「設計と実装 (レプリケーション)」を参照してください。

マージ レプリケーションを含む一般的なシナリオについては、「サーバーとクライアント間のデータのレプリケート」を参照してください。