トランザクションレプリケーションを設定すると、SQL ServerがID範囲の管理を手動に設定することに気付きました。つまり、サブスクリプションデータベースで、PKがID列であるテーブルに新しいレコードを挿入しようとすると、エラーが発生し、「1」、「2」のPKを挿入しようとしたと表示されます。 "、" 3 "などです。これは、サブスクライバーのすべてのID列の現在のID値が、パブリッシャーの状態に留まるのではなく、シード値(通常は1)にリセットされるためです。
SQL Serverがこれを行う理由を理解しました。サブスクライバーテーブルを読み取り専用のままにすることになっています。ただし、私のシナリオは少し正統ではありません-レプリケーションを通じて時々サブスクライバーを更新し、そのDBの即時バックアップを作成してから、サブスクライバーにいくつかの更新を実行して、パブリッシャーにプッシュバックされないようにします。サブスクライバを再度更新するときに、以前のバックアップからデータベースを復元し、最新の更新を取得します。これらの更新の間にサブスクライバーを更新したいので(可能であれば「一時的なデルタ」)、レプリケート時にID列が機能し、1にリセットされないようにする必要があります。
パブリケーションの設定時に自動ID範囲管理をオンにしようとしましたが、パブリケーションにテーブルを追加しようとすると、次のエラーが表示されます。
メッセージ21231、レベル16、状態1、プロシージャsp_MSrepl_addarticle、行2243
自動ID範囲のサポートは、サブスクライバーの更新を許可するパブリケーションでのみ役立ちます。
この問題を回避する方法はありますか?このレプリケーションをサブスクライバー側で読み取り専用であるかのようにSQL Serverに提示したいのですが、パブリッシャーにプッシュバックされる更新を行う予定はありませんが、一時的な更新を行います次の複製の前に消去されます。
スナップショットレプリケーションは、私の使用パターンではトランザクションレプリケーションよりも適切な方法であると考えましたが、問題は、スナップショットレプリケーションでは、更新ごとにすべてのデータベースを送信する必要があることです。最新のレプリケーションの後でDBの即時バックアップを取ることを計画しているため、毎回転送全体を実行する必要はありません。前回からの変化だけです。
Is there any way I can get round this problem?
SQL Server 2005 以降では、sys.sp_identitycolumnforreplicationを使用してID列をNOT FOR REPLICATIONとして設定する必要があります。レプリケーション用ではないようにID列を変更しても、記事を再スナップショットする必要はありません。GUIを使用しないでください。