sql >> データベース >  >> RDS >> Sqlserver

SQL ServerでCHECK制約を無効にする方法(T-SQLの例)

    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について知っておくべきことを参照してください。


    1. Oracleは最新の日付レコードを選択します

    2. PHPが複数のチェックボックスとテキストボックスの配列をMySQLデータベースに挿入

    3. 2つのMySQLテーブルをマージするにはどうすればよいですか?

    4. Access2016でテーブルをバックエンドデータベースにリンクする方法