如何禁用所有表的约束并启用它?

时间:2013-02-20 05:21:10

标签: sql-server sql-server-2008 foreign-keys constraints foreign-key-relationship

我有60张桌子。我想删除10个表,其中这10个表是约束(PK,FK)到其他20个表。删除这10个表时,我需要截断或删除其他20个表中的数据。最后,我想禁用所有60个表约束(FK,PK),然后在完成添加/删除表的工作后启用所有60个表约束。这可能吗?

当我放桌子时,它要求FK。当我截断那些FK依赖项时,它仍然显示相同。我不想搞砸那些FK,PK。

我想知道更聪明的方法。

4 个答案:

答案 0 :(得分:48)

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 foreign key constraint

如果您需要编写一个脚本来删除并创建约束,您可能会发现我的帖子更有用:
SQL Server: Howto get foreign key reference from information_schema?

答案 1 :(得分:23)

要禁用,您可以应用此功能:

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

启用:

EXEC sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"

答案 2 :(得分:7)

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;

答案 3 :(得分:5)

尝试使用此命令

ALTER TABLE table_Name NOCHECK CONSTRAINT all

禁用表的所有约束,并对所有10个表执行此操作,但在此之前检查是否未在表上放置任何Delete_Cascade,因为显示的错误可能也是因为sub_tables依赖性。如果它不起作用尝试通过此命令禁用特定约束,它可能有两个或三个额外的依赖项。

ALTER TABLE tableName NOCHECK CONSTRAINT constraintName