以下のコードを使用して、すべてのCHECK
を無効にすることができます SQLServerの現在のデータベースの外部キー制約。
EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL"
これは、Microsoftの文書化されていないsp_MSforeachtable
を使用します ストアドプロシージャ。この手順により、データベース内の各テーブルに対してタスクを実行できます。したがって、ここでのタスクには最適です–すべてのCHECK
を無効にする 現在のデータベース内の制約。
以下は、これを実行して結果を確認する例です。
例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 | 0 | 0 | | ConstraintTest | chkValidEndDate | 0 | 0 | | ConstraintTest | chkTeamSize | 0 | 0 | | Occupation | chkJobTitle | 0 | 0 | +----------------+-----------------+---------------+------------------+
したがって、現在4つのCHECK
があります 2つの異なるテーブルのデータベースの制約。
is_disabled であるため、すべての制約が有効になっていることがわかります。 0 に設定されています 。
例2–制約を無効にする
次に、すべての制約を無効にします:
EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL"
このようなことを行うときは、通常、正しいデータベースを使用していることを確認することをお勧めします。したがって、正しいデータベースに明示的に切り替えることで、上記のコードに追加できます。
USE Test; EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL"
この場合、 Test というデータベースに切り替えます。 。
例3–結果を確認する
上記のコードを実行したら、最初の例と同じクエリを実行して結果を確認します。
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 | 1 | 1 | +----------------+-----------------+---------------+------------------+
したがって、データベース内のすべての制約が無効になっています( is_disabled が原因) 列が 1 に設定されている それらの制約について)。
is_not_trusted に注意してください 列も 1 に設定されます 。これは、特に無効にした制約のいずれかを再度有効にする場合は、重要な考慮事項です。
制約を再度有効にするときに信頼を復元する方法については、SQLServerでCHECK制約を有効にするときにWITHNOCHECKについて知っておくべきことを参照してください。その記事の情報は外部キーにも適用されます。
制約を個別に無効にする
制約を1つずつ無効にするだけの場合は、例について「SQLServerでCHECK制約を無効にする方法」を参照してください。