在SQL Server中删除一组表
有没有一种简单的方法可以删除SQL Server中一组相互关联的表?理想情况下,我想避免担心他们被放入的顺序,因为我知道整个团队将在流程结束时消失。
解决方案
回答
我没有访问SQL Server进行测试的权限,但是如何做:
DROP TABLE IF EXISTS table1, table2, table3 CASCADE;
回答
我不确定Derek的方法是否可行。我们尚未将其标记为最佳答案。
如果不是这样,我想应该可以使用SQL Server 2005.
在那里,他们引入了异常(我还没有使用过)。因此,放下表,捕获异常(如果发生异常),然后尝试下一张表直到它们全部消失。
我们可以将表列表存储在临时表中,并根据需要使用游标进行遍历。
回答
我最终使用Apache的ddlutils为我执行了删除操作,尽管我只解决了这种解决方案,但该解决方案仅在sql server中有效,但我对它进行了排序。
@Derek Park,我不知道我们可以在此处用逗号分隔表格,这样很方便,但是它似乎并没有达到预期的效果。看来sql server不能识别IF EXISTS和CASCADE,运行"删除表X,Y,Z"似乎仅在按规定的顺序删除时才起作用。
另请参见http://msdn.microsoft.com/zh-cn/library/ms173790.aspx,其中描述了删除表的语法。
回答
阻止我们以任何顺序删除表的原因是表之间的外键依赖关系。因此,在开始之前,请先清除FK。
- 使用INFORMATION_SCHEMA系统视图,检索与这些表中的任何一个相关的所有外键的列表
- 放下每个外键
- 现在,我们应该可以使用所需的任何顺序删除所有表。
回答
一种不同的方法可能是:首先摆脱约束,然后一次性丢弃表格。
换句话说,为每个约束设置一个DROP CONSTRAINT,然后为每个表设置一个DROP TABLE。在这一点上,执行顺序不应该成为问题。
回答
冒着听起来愚蠢的风险,我认为SQL Server不支持delete / cascade语法。我认为我们可以配置删除规则以进行级联删除(http://msdn.microsoft.com/zh-cn/library/ms152507.aspx),但据我所知,SQL Server的诀窍是仅运行我们对每个要删除的表进行一次查询,然后检查它是否有效。
回答
这需要在数据库日志中找到的sp___drop___constraints脚本:
sp_MSforeachtable @command1="print 'disabling constraints: ?'", @command2="sp_drop_constraints @tablename=?" GO sp_MSforeachtable @command1="print 'dropping: ?'", @command2="DROP TABLE ?" GO
注意,如果要删除数据库中的所有表,请注意这一点,因此请务必小心