web-dev-qa-db-ja.com

外部キーが存在しないため、レプリケーションが失敗する

以前動作していたレプリケーションが動作するようにしようとしています。

私は多くの設定を試しましたが、それを機能させることができないようです。

これがシナリオです。すべてのFK制約を宛先データベース(DestDBと呼びます)から削除しました。

次にレプリケーションを再初期化し、実行すると次の(匿名化された)エラーが発生します。

ALTER TABLEステートメントがFOREIGN KEY制約 "FK_TableOnlyInDestDB_MyReplicatedTable"と競合しました。データベース「DestDB」、テーブル「SomeSchema.MyReplicatedTable」、列「MyReplicatedTableId」で競合が発生しました。 (ソース:MSSQLServer、エラー番号:547)

示されているFKがそのデータベースに存在しないので、それは私を混乱させています。

このデータベースを別のデータベースからコピー(バックアップと復元)しました。だから私が考えることができる唯一のことは、それがどういうわけかストリームを横切ることだということです。

しかし、そうは思われません。

どんなアイデアでもいいです!

注:これは、FKがないことを確認するために実行したクエリです(行が返されませんでした)。

use DestDB

SELECT f.name AS ForeignKey,
   OBJECT_NAME(f.parent_object_id) AS TableName,
   COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ColumnName,
   OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName,
   COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS ReferenceColumnName
FROM sys.foreign_keys AS f
INNER JOIN sys.foreign_key_columns AS fc ON f.OBJECT_ID = fc.constraint_object_id

また、問題のFKが(複製元のデータベースの)ソーステーブルにないことを確認しました。

私も試しました:EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'

MyReplicatedTableの削除も試みました。正常に削除され、レプリケーションによって再作成されました。 (それでもエラーが発生しました。)

サブスクライバーとして空のデータベースを作成してみました。これは正常に機能したため、問題の原因はDestDBにありますが、エラーのFKは存在しません。

4
Vaccano

このデッドスレッドを目覚めさせて申し訳ありませんが、質問が決定的でない場合は私はそれを嫌います。とにかく、私は同じ問題を抱えていました。どうやらSQLサーバーのレプリケーションでは、外部キーが「dbo.MSsavedforeignkeys」に保存されます。この場所にブロッカーFKが見つかりました。クイック delete dbo.MSsavedforeignkeys where constraint_name = N'FK_TableOnlyInDestDB_MyReplicatedTable'私の問題を解決しました。もちろん、レプリケーションが失敗した後にクリーンアップする「ベストプラクティス」の方法は他にもあります。

5
Sven-Erik

アーロンが述べたように、SQL Serverはオブジェクトを発明しないので、どこかにある必要があります。

私の最初の考えは、あなたが思っているのとは別のデータベースでレプリケーションを指しているということです。 [サブスクリプションのプロパティ]ダイアログで、サブスクリプションの作成に使用されたデータベースを確認します。

また、使用しているレプリケーションのタイプも確認してください。それが双方向形式のいずれかである場合、その画期的な変更をパブリッシャーに適用しようとする可能性があります。

それでも問題が解決しない場合は、デフォルトの拡張イベントセッションをチェックして、エラーが発生したときに実際に何が実行されていたかを確認してください。その方法の詳細については、 http://www.brentozar.com/archive/2013/08/what-queries-are-failing-in-my-sql-server/ を参照してください。

これにより、何が起こっているのかを把握できます。

結局のところ、正しいデータベースにいて、存在しないFKを介してレプリケーションがまだトリップしている場合は、サブスクリプションと、場合によってはパブリケーションも削除して、最初から始めることをお勧めします。

3
Sebastian Meine

これは、おそらくパブリッシャーテーブルの1つにある既存の外部キーです。レプリケーションジョブはサブスクライバーテーブルでこの外部キーを変更および作成しようとしていますが、サブスクライバーのデータが次の外部キー制約のニーズに合わないため、これを行うことができません。

このエラーが発生した場合でも、データはサブスクライバーにレプリケートされる必要があります。

1
muratos

同様の問題があり、適用しようとしたスナップショットは無限ループにありました。 MSsavedforeignkeysからレコードを削除すると役立ちました。

エリックに感謝します。

0
Ajay