开发人员选择了一个后来意识到带来问题的对象是很常见的。坏消息是,当大多数开发人员意识到他们所选择的名称有问题的时候,通常在数据库里已经有了几百个查看表、存储过程和函数——而这个对象名在它们中间多次出现过。
在你能够冒风险更改名称之前,你需要确定任务的工作量。当对象是一个表格或者查看表的时候,你可以使用内置在企业管理器里(Enterprise Manager)的依赖性(Dependencies)这个工具。要使用它就要运行企业管理器,扩展数据库节点,再展开子节点(表格或者查看表),右击对象,选择所有任务(All Tasks),然后选择显示依赖性(Show Dependencies)。你得到了两个列表:依赖X的对象(Objects That Depend On X)和X所依赖的对象(Objects That X Depends On)。这个工具甚至提供了一个复选框,用于在第一层的依赖性和所有层的之间切换。但是光有列表你还是做不了任何事情。
要获得更有用的列表(例如你可以用来复制和粘贴的),你可以在一个查询里把sysobjects和sysdepends表格合并在一起,就像下面这样:
SELECT sysobjects.name, *
FROM sysdepends
JOIN sysobjects ON sysdepends.id = sysobjects.id
ORDER BY sysobjects.name
也你可以加入一个WHERE述词,如果你希望的话。你还有一些工作要做,因为它给你的所有东西就是依赖对象的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
要试验这个过程,就要打开查询分析器(Query Analyzer),选择数据库,然后上面的代码粘贴到一个窗口里。执行它并创建存储过程,然后调用这个过程,就像下面一样:
Ap_Occurrences 'OrderID'
你将获得一个用户函数、存储过程和查看表的列表,它会参照OrderID或者你作为参数传递的任何值。
Arthur Fuller开发数据库应用程序已经有20年了。他的专业经验包括Access ADPs、微软SQL 2000、MySQL和.NET。