【问题标题】:SQL Server 2005: How to drop selected tables, with all related objectsSQL Server 2005:如何删除选定的表以及所有相关对象
【发布时间】:2013-02-18 15:36:39
【问题描述】:

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

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

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

【问题讨论】:

    标签: sql sql-server sql-server-2005


    【解决方案1】:

    您想使用 system 表,其中包含有关约束、视图等的所有信息。http://msdn.microsoft.com/en-us/library/aa260604(v=sql.80).aspx

    我会专门查看sysforeignkeyssysconstraints 等并加入正确的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

    http://msdn.microsoft.com/en-us/library/ms189487.aspx

    【讨论】:

    • 据我了解,该脚本列出了相关表。还有一种方法可以列出依赖的存储过程和视图吗?我的意思是一种查找正在使用(引用)相关表的存储过程、视图(可能还有触发器和作业)的方法。
    【解决方案2】:

    这不是 brill,但如果您使用脚本工具并编写脚本删除并创建数据库中的所有对象。它确实根据它所知道的依赖顺序来做到这一点。

    【讨论】:

      【解决方案3】:

      这是我的第一个想法:使用 Information_Schema 视图找出有关表的元数据并据此采取行动。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-13
        • 1970-01-01
        • 1970-01-01
        • 2020-05-03
        • 2011-06-24
        • 1970-01-01
        • 1970-01-01
        • 2015-11-18
        相关资源
        最近更新 更多