2011-08-23 4 views
6

私は外部キーが大好きですが、私はそれらに1つの問題があります。テーブルへの外部キーを無効にする変換プログラムがあります。私がこれをやっている理由は、メインテーブルのすべてのレコードを再変換することができますが、他のテーブルはそれが巨大であるために毎回変換する必要はなく、そのままにしておきます。既存のデータをチェックして外部キーを有効にする

私は外部キーを無効にし、再度有効にするには、これらのコマンドを使用しています:

ALTER TABLE MyTableというNOCHECK CONSTRAINT MyConstraint私は再後にALTER TABLE MyTableとは、しかしCONSTRAINT MyConstraint

をチェック

「作成または再有効化に関する既存のデータをチェックする」という制約がまだ「いいえ」に設定されていることを確認します。制約を無効にしたため「いいえ」に設定されていますが、 。私はこれが制約を再有効化すると考えられ、既存のデータをチェックすると思いましたが、明らかにそうではありません。

これをALTER TABLEコマンドで変更する方法はありませんか?私は制約を落として再作成することができますが、私が持っているすべての外部キーを再作成するためのスクリプトを書くつもりはないと思います。

私はSQL Server 2008 R2を使用しています。

-- Enable the constraint 
ALTER TABLE MyTable 
WITH CHECK CHECK CONSTRAINT MyConstraint 
GO 

答えて

9

は、制約を再度有効にするには、すべての外部キーバレスが有効であることを確認を強制するために二回CHECKを指定する必要があります。

FOREIGN KEYとは is_not_trusted.Theseがsys.check_constraintsと sys.foreign_keys・カタログ・ビューで表示されているマークされて無効になっている制約を確認してください。これは、テーブルのすべての行についてシステムによって確認される時間が、 より長くないことを意味します。 でも、制約を再度有効にすると、 のALTER TABLEというWITH CHECKオプションを指定しないかぎり、既存の 行のテーブルに対する再検証は行われません。 WITH CHECKを指定すると、制約が再び信頼された とマークされます。

のRef .: Guidelines for Disabling Indexes and Constraints

(検索エンジンのための)コメントで述べたように、これはカタログ・ビューにsys.foreign_keys.is_not_trusted

に対応

+0

ありがとう、あなたは命を救う人です。 –

+1

SQL Server Management Studioの "外部キーの関係"ダイアログボックスの "sys.foreign_keys.is_not_trusted"は、 "既存のデータの作成または再有効化"に対応しています。 – leqid

関連する問題