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

SQL Serverでテーブルのすべてのチェックキーと外部キーの制約を有効にする方法(T-SQLの例)

    以下のコードを使用して、すべてのCHECKを有効にすることができます SQLServerの特定のテーブルの外部キー制約。

    SQL Serverで制約を有効にするときは、既存のデータをチェックするかどうかを決定する必要があります。既存のデータが制約のルールに違反する可能性があるため、テーブルにすでにデータが含まれている場合、これは重要な考慮事項です。

    サンプルステートメント

    以下は、既存のデータをチェックする場合と、制約を有効にしたときにチェックしない場合の違いを示す2つのサンプルステートメントです。

    既存のデータを確認するには、WITH CHECKを使用します 制約を有効にする場合はステートメントで、それ以外の場合はWITH NOCHECKを使用します 。

    チェックあり:

    ALTER TABLE TableName 
    WITH CHECK 
    CHECK CONSTRAINT ALL
    

    チェックなし:

    ALTER TABLE TableName 
    WITH NOCHECK 
    CHECK CONSTRAINT ALL
    

    TableNameを置き換えるだけです 該当するテーブルの名前を使用します。

    以下は、これを実行して結果を確認する例です。

    例1-制約を確認する

    まず、現在のCHECKを簡単に見ていきます。 データベース内の制約。それらが有効か無効かを確認します。

    SELECT
      OBJECT_NAME(parent_object_id) AS 'Table',
      name AS 'Constraint',
      is_disabled, 
      is_not_trusted
    FROM sys.foreign_keys
    UNION
    SELECT 
      OBJECT_NAME(parent_object_id),
      name,
      is_disabled, 
      is_not_trusted
    FROM sys.check_constraints;
    

    結果:

    +----------------+-----------------+---------------+------------------+
    | Table          | Constraint      | is_disabled   | is_not_trusted   |
    |----------------+-----------------+---------------+------------------|
    | ConstraintTest | chkPrice        | 1             | 1                |
    | ConstraintTest | chkValidEndDate | 1             | 1                |
    | ConstraintTest | chkTeamSize     | 1             | 1                |
    | Occupation     | chkJobTitle     | 0             | 0                |
    +----------------+-----------------+---------------+------------------+
    

    したがって、現在4つのCHECKがあります データベース内の制約。そのうちの3つはConstraintTest用です。 テーブル。

    is_disabled が原因で、テーブルのすべての制約が無効になっていることがわかります。 1 に設定されています 。

    is_not_trusted もわかります 列が 1 に設定されている これらの制約のために。これは、彼らが信頼されていないことを意味します。無効なデータはチェックされずにデータベースに入る可能性があるため、無効になっている間は信頼できません。詳細については、以下をご覧ください。

    他の制約(別のテーブルの場合)はすでに有効化されて信頼されています(ただし、この記事ではそのテーブル/制約を無視できます)。

    例2–WITHCHECKを使用して制約を有効にする

    次に、ConstraintTestのすべての制約を有効にします テーブル:

    ALTER TABLE ConstraintTest 
    WITH CHECK CHECK CONSTRAINT ALL;
    

    これで完了です。

    次に、最初の例と同じクエリを実行して、結果を確認しましょう。

    SELECT
      OBJECT_NAME(parent_object_id) AS 'Table',
      name AS 'Constraint',
      is_disabled, 
      is_not_trusted
    FROM sys.foreign_keys
    UNION
    SELECT 
      OBJECT_NAME(parent_object_id),
      name,
      is_disabled, 
      is_not_trusted
    FROM sys.check_constraints;
    

    結果:

    +----------------+-----------------+---------------+------------------+
    | Table          | Constraint      | is_disabled   | is_not_trusted   |
    |----------------+-----------------+---------------+------------------|
    | ConstraintTest | chkPrice        | 0             | 0                |
    | ConstraintTest | chkValidEndDate | 0             | 0                |
    | ConstraintTest | chkTeamSize     | 0             | 0                |
    | Occupation     | chkJobTitle     | 0             | 0                |
    +----------------+-----------------+---------------+------------------+
    

    ConstraintTest の3つの制約すべて これで、テーブルが有効になり、信頼されます。

    WITH CHECKを使用したので、信頼されています 私の声明で。そうしなかった場合は、以下に示すように、別の結果が得られたでしょう。

    WITH CHECKを使用する 、テーブル内の既存のデータが実際に制約に準拠していることを確認できます。

    例3–WITHNOCHECKを使用して制約を有効にする

    次に、WITH CHECKを使用して制約を再度有効にします これが結果にどのように影響するかを確認できます。

    ただし、最初にそれらを無効にする必要があります:

    ALTER TABLE ConstraintTest 
    NOCHECK CONSTRAINT ALL;
    

    それらが無効になっていることを確認してください:

    SELECT
      OBJECT_NAME(parent_object_id) AS 'Table',
      name AS 'Constraint',
      is_disabled, 
      is_not_trusted
    FROM sys.foreign_keys
    UNION
    SELECT 
      OBJECT_NAME(parent_object_id),
      name,
      is_disabled, 
      is_not_trusted
    FROM sys.check_constraints;
    

    結果:

    +----------------+-----------------+---------------+------------------+
    | Table          | Constraint      | is_disabled   | is_not_trusted   |
    |----------------+-----------------+---------------+------------------|
    | ConstraintTest | chkPrice        | 1             | 1                |
    | ConstraintTest | chkValidEndDate | 1             | 1                |
    | ConstraintTest | chkTeamSize     | 1             | 1                |
    | Occupation     | chkJobTitle     | 0             | 0                |
    +----------------+-----------------+---------------+------------------+
    

    そのため、もう一度無効になります。

    次に、WITH NOCHECKを使用してそれらを再度有効にします :

    ALTER TABLE ConstraintTest 
    WITH NOCHECK CHECK CONSTRAINT ALL;
    

    もう一度確認してください:

    SELECT
      OBJECT_NAME(parent_object_id) AS 'Table',
      name AS 'Constraint',
      is_disabled, 
      is_not_trusted
    FROM sys.foreign_keys
    UNION
    SELECT 
      OBJECT_NAME(parent_object_id),
      name,
      is_disabled, 
      is_not_trusted
    FROM sys.check_constraints;
    

    結果:

    +----------------+-----------------+---------------+------------------+
    | Table          | Constraint      | is_disabled   | is_not_trusted   |
    |----------------+-----------------+---------------+------------------|
    | ConstraintTest | chkPrice        | 0             | 1                |
    | ConstraintTest | chkValidEndDate | 0             | 1                |
    | ConstraintTest | chkTeamSize     | 0             | 1                |
    | Occupation     | chkJobTitle     | 0             | 0                |
    +----------------+-----------------+---------------+------------------+
    

    制約が正常に有効化されていることがわかりますが、今回は信頼されていません。

    制約は、有効になる前に既存のデータをチェックしなかったため、信頼されていません。

    したがって、ここで重要なポイントは、制約を信頼できるようにする場合は、必ずWITH CHECKを使用することです。 それらを有効にするとき。

    制約を個別に有効にする

    すべての制約を一度に有効にしたくない場合は、個別に有効にすることができます。これは、すべての制約を有効にする必要があるが、異なる設定を使用する必要がある場合にも役立ちます(例:WITH CHECK 一部およびWITH NOCHECK 他の人のために)。

    SQLServerでCHECK制約を有効にする方法およびSQLServerで外部キーを有効にする方法を参照してください。


    1. 文字列をコンマで結合するためのOracle集計、およびカスタム集計の記述について

    2. OracleのTO_CHAR(number)関数

    3. ERデータモデルの概要

    4. TO_SECONDS()の例– MySQL