次の方法で共有


マージ レプリケーション

適用対象:SQL Server

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

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

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

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

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

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

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

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

マージ レプリケーションは、SQL Server スナップショット エージェントおよびマージ エージェントによって実装されます。 パブリケーションがフィルター選択されていない場合や静的フィルターを使用している場合、スナップショット エージェントでは 1 つのスナップショットが作成されます。 パブリケーションがパラメーター化されたフィルターを使用している場合、スナップショット エージェントではデータのパーティションごとに 1 つのスナップショットが作成されます。 マージ エージェントは、初期スナップショットをサブスクライバーに適用します。 また、初期スナップショットの作成後にパブリッシャーまたはサブスクライバーで発生したデータの増分変更がマージされ、ユーザーが構成したルールに従って競合を検出し、解決します。

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

次の図は、マージ レプリケーションで使用されるコンポーネントを示しています。

マージ レプリケーション コンポーネントとデータ フローの図。

このセクションでは...