32

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

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

もっとスマートな方法を知りたいです。

4

4 に答える 4

53
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: Howto get foreign key reference from information_schema?

于 2013-02-20T05:27:49.817 に答える
30

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

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

有効にする:

EXEC sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
于 2013-11-27T17:29:30.043 に答える
8
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;
于 2013-02-20T05:47:59.913 に答える
5

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

ALTER TABLE table_Name NOCHECK CONSTRAINT all

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

ALTER TABLE tableName NOCHECK CONSTRAINT constraintName
于 2013-02-20T05:45:25.407 に答える