60個のテーブルがあります。これらの10個のテーブルがConstraints(PK、FK)である10個のテーブルを他の20個のテーブルにドロップします。これらの10個のテーブルを削除する際、他の20個のテーブルのデータを切り捨てるか削除する必要があります。最後に、テーブルの追加/削除の作業が完了したら、60個のテーブル制約(FK、PK)をすべて無効にし、60個のテーブル制約をすべて有効にします。これは可能ですか?
テーブルをドロップすると、FKが要求されます。これらのFK依存関係を切り捨てると、やはり同じことが示されます。私はそれらすべてのFK、PKを台無しにしたくありません。
もっと賢い方法を知りたい。
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から外部キー参照を取得する方法
無効にするには、これを適用できます:
EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"
有効にする:
EXEC sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
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;
このコマンドを使用してみてください
ALTER TABLE table_Name NOCHECK CONSTRAINT all
あなたのテーブルのすべての制約を無効にし、10個のテーブルすべてに対してそれを行いますが、その前に、おそらくsub_tables依存関係のために表示されるエラーのためにテーブルにDelete_Cascadeを配置していないかどうかを確認してくださいうまくいかなかった場合、このコマンドで特定の制約を無効にしようとすると、おそらく2つまたは3つの余分な依存関係があります。
ALTER TABLE tableName NOCHECK CONSTRAINT constraintName