所以这里有一个有趣的...我正在努力复制一个完整的数据库(db1)
并从一个数据库到另一个(db2)
进行结构化,在此之前我决定尝试删除db2中的所有表。我做了通常的sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAING ALL'
,然后是sp_msforeachtable 'DROP TABLE ?'
,令我沮丧的是,它删除了所有6个表的保存。这些表似乎仍然有外键引用。我做了一个搜索,发现这个SQL DROP TABLE foreign key constraint向我展示了如何找到然后尝试删除那些外键引用。
这是有趣的部分:在尝试使用该信息删除它们时,我被告知ssms找不到该对象,因为它不存在或者我没有权限。外键引用来自我之前删除的表。
怎么可能?我到底如何从这里进步?
答案 0 :(得分: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
现在有效。