我有60桌。 我要下降10桌,其中这10个表是约束(PK,FK)与其他20桌。 虽然这些下探10桌,我需要从其他20桌截断或删除数据。 最后,我要禁用所有60个表的约束(FK,PK),然后让所有60个表约束,而我正增加/删除表的工作做完之后。 这可能吗?
当我删除表它所需要的FK。 当我截断的FK的依赖也依然呈现出相同。 我不想惹那些FK,PK。
我想知道更聪明的方法。
我有60桌。 我要下降10桌,其中这10个表是约束(PK,FK)与其他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服务器:HOWTO得到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个表,但检查之前,如果你还没有把任何Delete_Cascade你的表,因为这是显示,因为sub_tables的也许是错误的依赖关系了。 如果没有工作,试图通过这个命令来禁用特定的约束,它也许是两只或三个额外的依赖。
ALTER TABLE tableName NOCHECK CONSTRAINT constraintName