web-dev-qa-db-ja.com

すべてのテーブルの制約を無効にして有効にする方法は?

60個のテーブルがあります。これらの10個のテーブルがConstraints(PK、FK)である10個のテーブルを他の20個のテーブルにドロップします。これらの10個のテーブルを削除する際、他の20個のテーブルのデータを切り捨てるか削除する必要があります。最後に、テーブルの追加/削除の作業が完了したら、60個のテーブル制約(FK、PK)をすべて無効にし、60個のテーブル制約をすべて有効にします。これは可能ですか?

テーブルをドロップすると、FKが要求されます。これらのFK依存関係を切り捨てると、やはり同じことが示されます。私はそれらすべてのFK、PKを台無しにしたくありません。

もっと賢い方法を知りたい。

28
Out
EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL"
GO

これを行うこともできます。

EXEC sp_MSforeachtable @command1="ALTER TABLE ? DISABLE TRIGGER ALL"
GO

後で有効にするには

EXEC sp_MSforeachtable @command1="ALTER TABLE ? ENABLE TRIGGER ALL"
GO

-- SQL enable all constraints - enable all constraints sql server
-- sp_MSforeachtable is an undocumented system stored procedure
EXEC sp_MSforeachtable @command1="ALTER TABLE ? CHECK CONSTRAINT ALL"
GO

編集:
制約を無効にするだけでは不十分な場合は、制約を削除する必要があります。

テーブルを削除して再作成する場合は、後で外部キー制約を再作成する必要があります。

制約をドロップする必要がある場合、これは便利です。
SQL DROP TABLE外部キー制約

制約を削除して作成するスクリプトを作成する必要がある場合は、こちらの投稿がより便利です。
SQL Server:information_schemaから外部キー参照を取得する方法

49
Stefan Steiger

無効にするには、これを適用できます:

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

有効にする:

EXEC sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
25
SrividhyaShama
declare @tname varchar(128), @tschema varchar(128);

declare tables cursor for
select TABLE_SCHEMA, TABLE_NAME
from INFORMATION_SCHEMA.TABLES;

open tables;

fetch next from tables
    into @tschema, @tname;

while @@FETCH_STATUS = 0
begin
    execute ('alter table [' + @tschema + '].[' + @tname + '] nocheck constraint all');
    fetch next from tables
        into @tschema, @tname;
end;

close tables;

deallocate tables;
7
Alexey

このコマンドを使用してみてください

ALTER TABLE table_Name NOCHECK CONSTRAINT all

あなたのテーブルのすべての制約を無効にし、10個のテーブルすべてに対してそれを行いますが、その前に、おそらくsub_tables依存関係のために表示されるエラーのためにテーブルにDelete_Cascadeを配置していないかどうかを確認してくださいうまくいかなかった場合、このコマンドで特定の制約を無効にしようとすると、おそらく2つまたは3つの余分な依存関係があります。

ALTER TABLE tableName NOCHECK CONSTRAINT constraintName
5
Maryam Arshi