マージ レプリケーションは、トランザクション レプリケーションと同様に、通常はパブリケーション データベース オブジェクトとデータのスナップショットから始まります。 パブリッシャーとサブスクライバーで行われた後続のデータ変更とスキーマの変更は、トリガーで追跡されます。 サブスクライバーは、ネットワークに接続するとパブリッシャーと同期し、最後に同期が行われた後にパブリッシャーとサブスクライバーの間で変更されたすべての行を交換します。
マージ レプリケーションは、通常、サーバー間環境で使用されます。 マージ レプリケーションは、次のいずれかの状況で適切です。
複数のサブスクライバーが、同じデータをさまざまな時点で更新し、それらの変更をパブリッシャーや他のサブスクライバーに反映する場合があります。
サブスクライバーは、データを受信し、オフラインで変更を行い、後でパブリッシャーや他のサブスクライバーと変更を同期する必要があります。
各サブスクライバーには、データの異なるパーティションが必要です。
競合が発生する可能性があり、競合が発生した場合は、それらを検出して解決する機能が必要になります。
アプリケーションでは、中間データ状態にアクセスするのではなく、ネット データの変更が必要です。 たとえば、サブスクライバーがパブリッシャーと同期する前にサブスクライバーで行が 5 回変更された場合、その行はパブリッシャーで 1 回だけ変更され、ネット データの変更 (つまり 5 番目の値) が反映されます。
マージ レプリケーションを使用すると、さまざまなサイトが自律的に動作し、後で更新を 1 つの均一な結果にマージできます。 更新は複数のノードで行われるため、パブリッシャーと複数のサブスクライバーによって同じデータが更新されている可能性があります。 そのため、更新プログラムがマージされ、マージ レプリケーションで競合を処理するさまざまな方法が提供されると、競合が発生する可能性があります。
マージ レプリケーションは、SQL Server スナップショット エージェントとマージ エージェントによって実装されます。 パブリケーションがフィルター処理されていないか、静的フィルターを使用している場合、スナップショット エージェントは 1 つのスナップショットを作成します。 パブリケーションでパラメーター化されたフィルターを使用する場合、スナップショット エージェントはデータのパーティションごとにスナップショットを作成します。 マージ エージェントは、初期スナップショットをサブスクライバーに適用します。 また、初期スナップショットの作成後にパブリッシャーまたはサブスクライバーで発生した増分データ変更もマージし、構成した規則に従って競合を検出して解決します。
変更を追跡するため、マージ レプリケーション (およびキュー更新サブスクリプションを使用したトランザクション レプリケーション) では、パブリッシュされたすべてのテーブルのすべての行を一意に識別できる必要があります。 このマージ レプリケーションを実行するには、テーブルに ROWGUIDCOL プロパティが設定されたデータ型の列が既にuniqueidentifierされていない限り、すべてのテーブルに列rowguidが追加されます (この場合、この列が使用されます)。 テーブルがパブリケーションから削除されると、 rowguid 列が削除されます。既存の列が追跡に使用されている場合、列は削除されません。 フィルターには、レプリケーションで行の識別に使用される rowguidcol を含めることはできません。
newid()関数は、rowguid列の既定値として提供されますが、必要に応じて各行の guid を指定できます。 ただし、値 000000000-0000-0000-0000-000000000000 を指定しないでください。
次の図は、マージ レプリケーションで使用されるコンポーネントを示しています。