主キーの制約が原因で、SQL Server 2008 で行を削除する際に問題が発生しています。
DELETE ステートメントが REFERENCE 制約と矛盾しています...
競合する主キーをエラー メッセージに表示する方法はありますか?
主キーの制約が原因で、SQL Server 2008 で行を削除する際に問題が発生しています。
DELETE ステートメントが REFERENCE 制約と矛盾しています...
競合する主キーをエラー メッセージに表示する方法はありますか?
SQL サーバー (または競合製品) には、競合の原因となっている特定のテーブルと行を通知するものは何も組み込まれていません。エラー メッセージは、検査する FK のみを示します。
JLo の回答に基づいて、各 FK テーブルをたどり、関連するレコードをカウントするテーブルに対して独自の [削除前に] トリガーを作成できます。SP を使用している場合は、try/catch ブロックを使用して同じことを行うことができます。
そのようなことを書くのはかなり退屈なので、あなたは私の同情を持っています. いくつかのテーブルに対してこれを行っていた場合は、コード ジェネレーター (T4 ツールキットまたは MyGeneration) を使用してテーブルを生成することをお勧めします。
これにより、特定のテーブルの外部キーが得られます。各ペアリングを自分で確認する必要があります。
SELECT
f.name as [Foreign Key],
OBJECT_NAME(f.parent_object_id) as [Table],
COL_NAME(fc.parent_object_id, fc.parent_column_id) as [Column],
OBJECT_NAME(f.referenced_object_id) as [Reference Table],
COL_NAME(fc.referenced_object_id, fc.referenced_column_id) as [Reference Column]
FROM sys.foreign_keys f
JOIN sys.foreign_key_columns fc
ON fc.constraint_object_id = f.object_id
WHERE fc.parent_object_id = OBJECT_ID(N'[dbo].[Document]')
これで始められるはずです...頑張ってください!
制約されている値は、削除しようとしている値の 1 つです。
delete from tableA where value = 123
値が 123 の外部キー制約が別のテーブルのどこかにある場合、制約エラーがスローされます...これが、制約に適切な名前を付けることが重要である理由ですが、そうでない場合は、いつでも J LO のスクリプトを実行してどの制約を把握することができますか?利用可能です。
次のようなより複雑なものについて
delete from tableA where value IN (select top 10 * from tableA)
削除を select * from に変更し、上記のような IN ステートメントを使用してこれらの値を相互参照します。サブクエリを直接実行することもできますが、これは単なる例です。