0

我刚刚向旧数据库添加了大约 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

问题是我仍然遇到错误:

消息 3726,级别 16,状态 1,第 17 行无法删除对象 'dbo.Table1',因为它被 FOREIGN KEY 约束引用。消息 3726,级别 16,状态 1,第 18 行无法删除对象“dbo.Table2”,因为它被 FOREIGN KEY 约束引用。

谁能建议我做错了什么?我在 Windows 7 上使用 SQL Server 2008 r2。

编辑:我注意到我有一个循环引用,即 Table1 对 Table2 有一个 FK,反之亦然,但即便如此......

4

1 回答 1

1

您可以在运行 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
于 2012-11-20T20:30:24.833 回答