有一个巨大的MS Sql Server 2005数据库的副本,有超过1300个表,加上数百个存储过程和数十个视图,不计算作业。它被多个应用程序使用。
我需要减少这个怪物,只留下少于200个表和100个存储过程以及其他相关对象,这是一个应用程序正常工作所必需的。当然,此应用程序使用的表和存储过程的确切列表,但没有办法列出未直接从代码中调用的对象(如作业,视图,触发器等)。
所以有一个问题:请建议完成该任务的最佳方法。如何安全删除1000个表,列出第一个相关对象(如外键,相关视图和存储过程,作业,触发器等),如果这些对象不指向应用程序所需的其他对象(表或存储过程),删除它们然后删除表。存储过程也是如此。
答案 0 :(得分:2)
您想要使用system
表,其中包含有关约束,视图等的所有信息。http://msdn.microsoft.com/en-us/library/aa260604(v=sql.80).aspx
我会专门查看sysforeignkeys
和sysconstraints
等并加入正确的object_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 =使用OBJECT_ID IN(....所有你的对象id)
此脚本基于(How can I list all foreign keys referencing a given table in SQL Server?)
的答案之一修改强>
从@ Jacek的评论中,您也可以使用stored procedure sp_depends
答案 1 :(得分:0)
这是我的第一个想法:使用Information_Schema视图查找有关表的元数据并根据该数据采取操作。
答案 2 :(得分:0)
这不是brill,但如果您使用脚本工具并编写一个drop并创建数据库中的所有obejcts。它确实基于它所知道的依赖顺序来完成它。