0

SQLServerのデータに関連する問題があります。私のデータベースでは、いくつかの制約が有効になっていない、つまりチェックされていませんでした。しばらく作業した後、子を削除せずに親行を削除できるというこの問題が見つかりました。これは問題でした。クエリを使用してデータベース内のすべての制約を有効にしました

ALTER TABLE tbl_name CHECK CONSTRAINT ALL 

上記のクエリは、そのデータベースのすべてのテーブルでエラーなしで実行されました。しかし、私の懸念は、それが機能するかどうかです。既存のデータで機能する場合、親テーブルのデータが削除されたデータはどうなりますか。

親レコードがデータベース全体に存在しないようなデータデータを検証できる方法があるかどうかを知りたいです。270 constraint含むことについてありますFOREIGN KEY AND UNIQUE KEY。手動オプションは使いたくありません。

私を助けてください。

4

2 に答える 2

1
ALTER TABLE tbl_name CHECK CONSTRAINT ALL

制約を再度有効にするだけです。重要なのは、制約データベース内の既存のデータに対してチェックされないことです(また、オプティマイザーによって制約が信頼されることもありません)。それを発生させたい場合は、WITH CHECK以下も指定する必要があります。

ALTER TABLE tbl_name WITH CHECK CHECK CONSTRAINT ALL

(はい、その単語CHECKは2回表示されます)

これを実行し、孤立した子行(または他の無効な制約)があるALTER TABLE場合、はエラーメッセージで失敗します。この問題を修正するためにSQLServerでできることは何もありません。つまり、a)孤立した行を削除するか、b)何らかの方法でそれらに適した親行を再作成するかを決定する必要があります。

于 2012-09-18T06:13:45.057 に答える
0

また、外部キーの最後に「ON DELETE CASCADE」コードを追加して、孤立した子行が存続しないようにすることもできます。

これは、解決策というよりも今後の「より良い実践」ですが、Damien_The_Unbelieverがあなたの主な質問に答えたと思います。

于 2012-11-27T19:45:59.013 に答える