找出一个对象名称的所有出现处

ZDNet软件频道 时间:2004-11-17 作者:Builder.com |  我要评论()
本文关键词:ArthurFuller oracle sqltips
开发人员通常会发现他们以前为某个对象选择的名称会引起问题。
本文译自Builder.com,未经许可请勿转载

开发人员通常会发现他们以前为某个对象选择的名称会引起问题。坏消息是在大多数开发人员意识到他们所选择的对象名称有问题时,一般在数据库中已经有了几百个视图、存储过程和函数——而且这些对象名称已经出现了很多次。

在冒风险更改对象名称之前,你需要确定任务量。在感兴趣的对象是表或视图时,你可以使用 Enterprise Manager (企业管理器) 中内建的Dependencies (相关性)工具。要使用这一工具,运行企业管理器,展开数据库节点,扩展你所关心的子节点(表或视图),右键点击你所关心的对象,选择 All Tasks (所有任务),然后选择 Show Dependencies (显示相关性)。这样将得到两个列表:Objects That Depend On X (依附于 X 的对象) 和Objects That X Depends On (X 依附的对象)。该工具甚至还提供了一个复选框用于选择是只显示第一级的相关性,还是显示所有级的相关性。然而,事实上你不能用这些列表做任何事情。

要想得到一个更加有用的列表(例如,可以拷贝和粘贴),你可以在联接查询sysobjects和sysdepends表,如下所示:

SELECT sysobjects.name, *
FROM sysdepends
JOIN sysobjects ON sysdepends.id = sysobjects.id
ORDER BY sysobjects.name

如果有需要,还可以添加WHERE 谓词。你依然需要添加更多东西才能得到你要的结果,因为它所有能为你提供的是依赖对象的 ID,你必须转换这个 ID。

在感兴趣的对象不是表或视图而是一个列名时,问题就出现了。企业管理器没有提供一种简便的方法来确定依赖给定列的所有存储过程、视图和用户函数。

有关所有这些对象的文字都存储在表syscomments的一个叫做 Text 的列中。该表的主键是对象 ID,所以你可以通过将其与sysobjects表进行联接查询以搞清楚对象的名称。

下面的存储过程完成这个联接,并接受一个参数,这个参数被认为是感兴趣的对象。你可以传入一个表或视图的名称。它能正确执行,但是我编写这个过程主要是为了处理列名称。

CREATE PROCEDURE ap_Occurrences

    (
        @Target varchar(100)
    )

AS
    /* SET NOCOUNT ON */
    SELECT
        sysobjects.Name,
        syscomments.Text,
        CASE
        WHEN xtype = 'P' then 'Stored Procedure'
        WHEN xtype = 'V' then 'View'
        WHEN xtype = 'IF' then 'Function'
        ELSE xtype
        END
        AS 'Object Type'
    FROM
        syscomments JOIN sysobjects ON syscomments.id = sysobjects.id
    WHERE
        CHARINDEX(@Target, Text) > 0
    ORDER BY [Object Type], Name
    RETURN

要测试这个过程,打开查询分析器,选择一个感兴趣的数据库,然后将上面的代码粘贴到一个窗口中。执行代码以创建存储过程,然后以如下方式调用存储过程:

Ap_Occurrences 'OrderID'

你将得到一个引用了OrderID或者你作为参数传入的值的用户函数、存储过程以及视图列表。


本文作者:Arthur Fuller 开发数据库应用程序已经有20余年的经验。他经常使用 Access ADP、Microsoft SQL Server 2000、MySQL 和 .NET。


责任编辑:李宁

欢迎评论投稿

百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134