以下は、無効になっている現在のデータベースの外部キーの名前を返します。つまり、WITH NOCHECK
SQL Server 2005/2008 の場合:
select * from sys.foreign_keys where is_disabled=1
無効と信頼されていないことの違いについての回答でいくつかの議論がありました.What's belowは違いを説明しています.is_disabledとisnotrustedの違いを明確にするためのコードは次のとおりです. (i int not null, fk int not null)create table t2(i int not null)-- t2alter テーブル t2add 制約 pk_1 主キーに主キーを作成 (i)-- t1alter テーブル t1add 制約 fk_1 に外部キーを作成 ( fk) 参照 t2 (i) -- いくつかのレコードを挿入t2 値を挿入(100)t2 値を挿入(200)t2 値を挿入(300)t2 値を挿入(400)t2 値を挿入(500)t1 値を挿入(1,100)t1 値を挿入(2,100)t1 値を挿入(3,500)t1 値を挿入(4,500)------------------------------- 1. 有効で信頼できる選択name,is_disabled,is_not_trusted from sys.foreign_keysGO-- 2. constraintalter テーブルを無効にします t1 NOCHECK CONSTRAINT fk_1select name,is_disabled,is_not_trusted from sys.foreign_keysGO-- 3. 制約を再度有効にします。data isnt c hecked, so not trusted.-- これは、オプティマイザーがまだ columnalter テーブルをチェックする必要があることを意味します t1 CHECK CONSTRAINT fk_1 select name,is_disabled,is_not_trusted from sys.foreign_keysGO--4外部キー制約をドロップ &再追加 -- チェックされていることを確認してから -- 制約が有効になり、trustedalter table t1 DROP CONSTRAINT fk_1alter table t1 WITH CHECK 制約を追加 fk_1 外部キー (fk) 参照 t2 (i)select name,is_disabled ,sys.foreign_keysGO からの is_not_trusted--5.外部キー制約をドロップ &追加しますが、チェックは行いません-- 制約は有効になりますが、信頼されません テーブル t1 を削除する DROP CONSTRAINT fk_1テーブル t1 を変更します WITH NOCHECK 制約を追加します fk_1 外部キー (fk) は t2 を参照します (i)sys から名前を選択します,is_disabled,is_not_trusted .foreign_keysGO
is_disabled
制約が無効であることを意味します
信頼されていません
これは、列が外部キー テーブルに対してチェックされていることを SQL Server が信頼していないことを意味します。
したがって、外部キー制約の再有効化が最適化されるとは限りません。オプティマイザが列を信頼するようにするには、外部キー制約を削除して WITH CHECK
で再作成することをお勧めします オプション (4.)