CHECK
が完全に有効になっているテーブルにデータを入力しようとしたとき 制約がある場合、データがその制約に違反していない場合にのみ成功します。無効なデータを入力しようとすると、操作はエラーで失敗します。
しかし、本当にしなければならない状況に陥ったらどうなるでしょうか。 CHECK
に違反するデータを挿入します 制約?おそらく、制約が適用されなくなったか、1つの行が制約をバイパスできるという例外があります。いずれにせよ、制約のルール以外のものを入力することはできません。
このような状況に陥った場合は、いつでも制約を無効にすることができます。 Transact-SQLを使用してこれを行う方法は次のとおりです。
例1-CHECK制約を無効にする
CHECK
を無効にするには 制約、NOCHECK
を使用します ALTER TABLE
内の引数 ステートメント。
このように:
ALTER TABLE Occupation NOCHECK CONSTRAINT chkJobTitle;
このコードは、 chkJobTitle と呼ばれる制約を無効にします 。
例2–チェック制約を確認する
sys.check_constraints
にクエリを実行できます 制約が無効になっていることを確認するためのシステムビュー:
SELECT name, is_disabled, is_not_trusted, definition FROM sys.check_constraints;
結果:
+-----------------+---------------+------------------+----------------------------------------+ | name | is_disabled | is_not_trusted | definition | |-----------------+---------------+------------------+----------------------------------------| | chkPrice | 0 | 0 | ([Price]>(0)) | | chkValidEndDate | 0 | 0 | ([EndDate]>=[StartDate]) | | chkTeamSize | 0 | 0 | ([TeamSize]>=(5) AND [TeamSize]<=(20)) | | chkJobTitle | 1 | 1 | ([JobTitle]<>'Digital Nomad') | +-----------------+---------------+------------------+----------------------------------------+
この場合、すべてのCHECK
を選択しました 現在のデータベースからの制約。
無効になっているのはこれだけであることがわかります( is_disabled のため) 列が 1 に設定されている 。
is_not_trusted
に気付くかもしれません 列も
1
に設定されます 。これは、CHECK
が 制約は、すべての行についてシステムによって検証されていません。
つまり、制約がすべてのデータをチェックしたとはもはや想定できません。制約が無効になっているという事実は、データが制約によってチェックされることなくデータベースに入ることができることを意味します。したがって、データベースに無効なデータが存在する可能性があります。
CHECK
を再度有効にする必要がある場合 制約がある場合は、制約の信頼を復元する機会があります(WITH CHECK
を使用することにより) オプション)。これにより、制約を有効にする前に既存のすべての行がチェックされます。
しないオプションもあります 既存のデータをチェックしますが、これはまれなケースでのみ実行する必要があります。
制約を再度有効にする方法に応じて、信頼がどのように影響を受けるかについては、SQLServerでCHECK制約を有効にするときにWITHNOCHECKについて知っておくべきことを参照してください。