SQL Server 2005:如何删除包含所有相关对象的选定表

SQL Server 2005:如何删除包含所有相关对象的选定表,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,这里有一个巨大的MS Sql Server 2005数据库的副本,有1300多个表,加上数百个存储过程和几十个视图,不包括作业。它被多个应用程序使用 我需要精简这个怪物,只留下一个应用程序正常工作所需的不到200个表、100个存储过程和其他相关对象。当然,这个应用程序使用的表和存储过程有一个精确的列表,但是无法列出未直接从代码调用的对象(如作业、视图、触发器等) 所以有一个问题:请建议完成这项任务的最佳方法。如何安全地删除1000个表,列出第一个相关对象(如外键、相关视图和存储过程、作业、触发器

这里有一个巨大的MS Sql Server 2005数据库的副本,有1300多个表,加上数百个存储过程和几十个视图,不包括作业。它被多个应用程序使用

我需要精简这个怪物,只留下一个应用程序正常工作所需的不到200个表、100个存储过程和其他相关对象。当然,这个应用程序使用的表和存储过程有一个精确的列表,但是无法列出未直接从代码调用的对象(如作业、视图、触发器等)


所以有一个问题:请建议完成这项任务的最佳方法。如何安全地删除1000个表,列出第一个相关对象(如外键、相关视图和存储过程、作业、触发器等),如果这些对象不指向应用程序所需的其他对象(表或存储过程),请删除它们,然后删除表。存储过程也是如此。

您希望使用
系统
表,其中包含有关约束、视图等的所有信息

我会特别关注
sysforeignkeys
sysconstraints
等,并在正确的对象id上进行连接,要做到这一点,您可以执行以下操作:

select t.name as TableWithForeignKey, fk.constraint_column_id as FK_PartNo , c.name as ForeignKeyColumn 
from sys.foreign_key_columns as fk
inner join sys.tables as t on fk.parent_object_id = t.object_id
inner join sys.columns as c on fk.parent_object_id = c.object_id and fk.parent_column_id = c.column_id
where fk.referenced_object_id = (select object_id from sys.tables where name = 'TableOthersForeignKeyInto')
order by TableWithForeignKey, FK_PartNo
这将列出表中的外键,您可以替换WHERE name=以在(……所有对象ID)中使用对象_ID

此脚本基于()中的一个答案

编辑

从@Jacek的评论中,您还可以使用存储过程sp_dependens


这是我的第一个想法:使用Information\u Schema视图查找有关表的元数据,并根据这些元数据采取行动

这不是brill,但是如果您使用脚本工具并编写数据库中所有OBEJCT的拖放和创建脚本。它确实是根据它所知道的依赖顺序来做的

据我所知,脚本列出了相关的表。是否还有一种列出依赖存储过程和视图的方法?我指的是一种查找存储过程、视图(可能还有触发器和作业)正在使用(引用)相关表的方法。