Sql server 2008 使用sp_msforeachtable禁用FK约束会导致FK错误
我刚刚向遗留数据库添加了大约80个“缺少”的外键,并且(毫不奇怪)由于FK约束,数据库重新创建脚本现在在删除表时失败。这种策略一直以来都是以自然的顺序删除表,这一点到目前为止一直行之有效。我不想保持这种方法,并尝试禁用所有FK约束,如下所示:Sql server 2008 使用sp_msforeachtable禁用FK约束会导致FK错误,sql-server-2008,Sql Server 2008,我刚刚向遗留数据库添加了大约80个“缺少”的外键,并且(毫不奇怪)由于FK约束,数据库重新创建脚本现在在删除表时失败。这种策略一直以来都是以自然的顺序删除表,这一点到目前为止一直行之有效。我不想保持这种方法,并尝试禁用所有FK约束,如下所示: USE MYDB; GO EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all" GO DROP TABLE [dbo].[Table1] DROP TABLE [dbo].[Tabl
USE MYDB;
GO
EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"
GO
DROP TABLE [dbo].[Table1]
DROP TABLE [dbo].[Table2]
DROP TABLE [dbo].[Table3]
...
exec sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
GO
问题是我仍然会遇到错误:
Msg 3726,级别16,状态1,第17行无法删除对象
“dbo.Table1”,因为它被外键约束引用。味精
3726,级别16,状态1,第18行无法删除对象“dbo.Table2”
因为它被外键约束引用
有人能告诉我我做错了什么吗?我正在Windows 7上使用SQL Server 2008 r2
编辑:我注意到我有一个循环引用,即表1有一个FK到表2,反之亦然,但即使如此……在运行drop table命令之前,您可以删除所有约束。脚本顶部的类似内容应该可以工作
declare @newLine as varchar(1) = char(13);
declare @sqlCmd as varchar(max) = '';
SELECT @sqlCmd = @sqlCmd + 'alter table ' + OBJECT_NAME(parent_object_id) + ' drop constraint ' + OBJECT_NAME(OBJECT_ID) + ';' + @newLine
FROM sys.objects
WHERE type_desc LIKE '%CONSTRAINT'
and OBJECT_NAME(parent_object_id) not in ('list','of','tables','to','ignore')
order by case when left(OBJECT_NAME(OBJECT_ID),2) = 'PK' then 1 else 0 end
exec (@sqlCmd)
go
仅禁用FK约束是不够的。您需要实际删除它们以避免此错误。感谢您的确认。我复制了一个sp_dropconstraint存储过程,它在删除表之前执行必要的工作。我想我真正想要的是一些代码,这些代码将把我的drop table命令按顺序组织起来,以便它们工作。虽然循环引用将是一个问题…但问题是我尝试了答案中的代码,然后得到“表'Tablexxx'引用了约束'PK_u'xxxxx',外键约束'XPKxxxxxxxxx'”,。我做什么似乎无关紧要,有些事情失败了。我不能因为约束而删除表,也不能因为约束被表引用而删除它。似乎没有双赢的局面。我花了一天的大部分时间试图让我的脚本可靠地运行。看起来错误是由主键约束引起的。我更改了SQL命令以删除最后一个命令。让我知道这是否有帮助,汉克斯,就是这样。这对我来说很可靠。我用的是“外键约束”。