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

SQL Serverのデータベースですべてのチェックキーと外部キーの制約を無効にする方法(T-SQLの例)

    以下のコードを使用して、すべての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制約を無効にする方法」を参照してください。


    1. Oracle MobileCloudServiceの概要

    2. MySQLパスワード機能

    3. スーパーユーザーCREATEEXTENSIONhstoreのみが作成でき、Herokuでは作成できないのはなぜですか?

    4. SQLServerの大きなテーブルにNOTNULL列を追加するにはどうすればよいですか?