緊急フェールオーバーに使用されるスタンバイ マシンにプッシュされるトランザクション レプリケーションを使用してアプリケーションをセットアップしています。レプリケーションは機能しているように見えます。サーバー 1 に対して行われた挿入は、サーバー 2 に自動的に表示されます。
ただし、フェイルオーバーを完全に機能させることはできません。サーバー 1 が使用できなくなったシナリオ (サーバー 2 が使用される唯一のシナリオであるため、レプリケーションは一方向です) では、サーバー 2 で作業を続行し、移行をある程度シームレスにする必要があります。すべてのデータがすでに複製されているためです。
しかし、サーバー 2 に移動するとき、サーバー 1 のすべての更新が転送されたことを確認した後、一部のテーブルで主キー違反の例外が発生し続けます。
PRIMARY KEY 制約 'PK_TableA' に違反しています。オブジェクト 'dbo.TableA' に重複するキーを挿入できません。
次のような単純なクエリ
INSERT INTO TableA (Field1, Field2, TableB_ID) VALUES ('a','b', 6)
上記のエラーが発生します。テーブルに独自の ID を割り当てるように指示すると、クエリから省略して ( TableA
has ID int identity(1,1)
a フィールド)、SQL Server は PK 制約に違反する ID を自動割り当てするようです。これはなぜでしょうか?
TableA
のトリガーがINSERT
ありDELETE
、単純な非正規化ジョブを実行します
UPDATE TableB
SET Count = (SELECT COUNT(1) FROM TableA WHERE TableB.ID = TableA.TableB_ID)
WHERE ID IN(
-- Fetch affected ID's from deleted or inserted rows
SELECT DISTINCT TableB_ID FROM deleted
UNION
SELECT DISTINCT TableB_ID FROM inserted
)
これは、レプリケーションの時点で誤って Server 2 データベースの一部ではなかったので、後で挿入しました。現場での一貫性は、当面TableB.Count
のタスクにとって重要ではありません。PK Violation は、トリガーがサーバー 2 に存在する前、および作成後に発生しました。
パブリッシャーとサブスクライバーの両方で、違反を引き起こしている ID フィールドには次の定義があります。
[ID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL
複製ジョブが書き込まれることはないため、パブリッシャー上でその部分は冗長であると思いますがNOT FOR REPLICATION
、それが問題の原因であることもわかりません。