3

主キーの制約が原因で、SQL Server 2008 で行を削除する際に問題が発生しています。

DELETE ステートメントが REFERENCE 制約と矛盾しています...

競合する主キーをエラー メッセージに表示する方法はありますか?

4

3 に答える 3

2

SQL サーバー (または競合製品) には、競合の原因となっている特定のテーブルと行を通知するものは何も組み込まれていません。エラー メッセージは、検査する FK のみを示します。

JLo の回答に基づいて、各 FK テーブルをたどり、関連するレコードをカウントするテーブルに対して独自の [削除前に] トリガーを作成できます。SP を使用している場合は、try/catch ブロックを使用して同じことを行うことができます。

そのようなことを書くのはかなり退屈なので、あなたは私の同情を持っています. いくつかのテーブルに対してこれを行っていた場合は、コード ジェネレーター (T4 ツールキットまたは MyGeneration) を使用してテーブルを生成することをお勧めします。

于 2013-02-19T18:45:06.123 に答える
1

これにより、特定のテーブルの外部キーが得られます。各ペアリングを自分で確認する必要があります。

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]')

これで始められるはずです...頑張ってください!

于 2013-02-19T14:21:43.200 に答える
0

制約されている値は、削除しようとしている値の 1 つです。

delete from tableA where value = 123

値が 123 の外部キー制約が別のテーブルのどこかにある場合、制約エラーがスローされます...これが、制約に適切な名前を付けることが重要である理由ですが、そうでない場合は、いつでも J LO のスクリプトを実行してどの制約を把握することができますか?利用可能です。

次のようなより複雑なものについて

delete from tableA where value IN (select top 10 * from tableA)

削除を select * from に変更し、上記のような IN ステートメントを使用してこれらの値を相互参照します。サブクエリを直接実行することもできますが、これは単なる例です。

于 2013-02-19T18:51:45.580 に答える