Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 使用sp_msforeachtable禁用FK约束会导致FK错误_Sql Server 2008 - Fatal编程技术网

Sql server 2008 使用sp_msforeachtable禁用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

我刚刚向遗留数据库添加了大约80个“缺少”的外键,并且(毫不奇怪)由于FK约束,数据库重新创建脚本现在在删除表时失败。这种策略一直以来都是以自然的顺序删除表,这一点到目前为止一直行之有效。我不想保持这种方法,并尝试禁用所有FK约束,如下所示:

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命令以删除最后一个命令。让我知道这是否有帮助,汉克斯,就是这样。这对我来说很可靠。我用的是“外键约束”。