如何获得受一组存储过程影响的表的列表?
时间:2020-03-06 14:34:54 来源:igfitidea点击:
我有一个巨大的数据库,其中包含约100个表和约250个存储过程。我想知道受存储过程的一部分影响的表的列表。例如,我有250个存储过程中的50个存储过程的列表,我想知道将受这50个存储过程影响的表的列表。除了读取所有存储过程并手动查找表列表之外,还有其他简便的方法吗?
PS:我为此使用SQL Server 2000和SQL Server 2005客户端。
解决方案
一种非常具有侵入性的选择是获取重复的数据库,并在记录有事情发生的每个表上设置触发器。然后运行所有SP。如果我们无法对数据库进行大量修改,将无法正常工作
此外,如果我们还希望通过触发器来影响SP的表,请确保将日志记录添加到现有触发器中,而不是将其替换为日志记录。
sp_depends'StoredProcName'将返回存储过程依赖的对象名称和对象类型。
编辑:我更喜欢@KG的答案。恕我直言,更灵活。
这将是SQL Server查询:
SELECT [NAME] FROM sysobjects WHERE xType = 'U' AND --specifies a user table object id in ( SELECT sd.depid FROM sysobjects so, sysdepends sd WHERE so.name = 'NameOfStoredProcedure' AND sd.id = so.id )
希望这对某人有帮助。
我会在SQL 2005中这样做(如果只想为特定的proc取消注释" AND"行):
SELECT [Proc] = SCHEMA_NAME(p.schema_id) + '.' + p.name, [Table] = SCHEMA_NAME(t.schema_id) + '.' + t.name, [Column] = c.name, d.is_selected, d.is_updated FROM sys.procedures p INNER JOIN sys.sql_dependencies d ON d.object_id = p.object_id AND d.class IN (0,1) INNER JOIN sys.tables t ON t.object_id = d.referenced_major_id INNER JOIN sys.columns c ON c.object_id = t.object_id AND c.column_id = d.referenced_minor_id WHERE p.type IN ('P') -- AND p.object_id = OBJECT_ID('MyProc') ORDER BY 1, 2, 3