以下のコードを使用して、すべての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で外部キーを有効にする方法を参照してください。