0

所以这对你来说很有趣……我正在将一个完整的数据库(db1)和结构从一个数据库复制到另一个数据库(db2),在这样做之前,我决定尝试从 db2 中删除所有表。我照常做了sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAING ALL',然后sp_msforeachtable 'DROP TABLE ?'让我很沮丧的是,它删除了所有可能只剩下 6 张桌子的东西。这些表似乎仍然有对它们的外键引用。我进行了搜索,发现了这个SQL DROP TABLE 外键约束,它向我展示了如何查找然后尝试删除这些外键引用。

这是有趣的部分:在尝试使用该信息删除它们时,我被告知 ssms 找不到该对象,因为它不存在或我没有权限。外键引用来自我之前删除的表。

这怎么可能?我到底要如何从这里进步?

4

1 回答 1

0

我不知道您在“尝试删除它们时”是什么意思。如果您试图从系统表中删除外键,那肯定是一个错误。

我的猜测是您现在可以删除最后 6 个表。

假设我们有两个表 A 和 B

create table A (a int) 
create table B(b int, foreign key (b) references (A.a))

我们尝试删除表格。 drop table A将失败,因为 B 使用声明的外键引用它。但是我们可以自由drop table B,因为 A 不在乎它是否不再被引用。

所以在第一遍之后,一个DROP失败一个成功,留下一个表,现在没有 FK 引用。再试一次,瞧!,drop table A现在可以工作了。

于 2013-04-21T05:59:27.990 回答