谢谢!
with dep_cte as (
select o2.object_id as parent_id
,o2.name as parent_name
,o1.object_id as child_id
,o1.name as child_name
,d.referenced_minor_id
,1 as hierarchy_level
from sys.sql_dependencies d
join sys.objects o1
on o1.object_id = d.referenced_major_id
join sys.objects o2
on o2.object_id = d.object_id
where d.referenced_minor_id in (0,1)
and not exists
(select 1
from sys.sql_dependencies d2
where d2.referenced_major_id = d.object_id)
union all
select o2.object_id as parent_id
,o2.name as parent_name
,o1.object_id as child_id
,o1.name as child_name
,d.referenced_minor_id
,d2.hierarchy_level + 1 as hierarchy_level
from sys.sql_dependencies d
join sys.objects o1
on o1.object_id = d.referenced_major_id
join sys.objects o2
on o2.object_id = d.object_id
join dep_cte d2
on d.object_id = d2.child_id
where d.referenced_minor_id in (0,1)
)
select *
from dep_cte
order by hierarchy_level
现在我需要向社区开放这个问题。有没有方便访问正在运行的Oracle实例的人可以在这里发布一个CONNECT BY递归查询?请注意,这是特定于SQL Server的问题,问题所有者已经明确表示他正在使用Oracle。我手头没有运行中的Oracle实例来开发和测试任何东西。
虽然不是非常深入或全面,但我认为如果您使用的是MS SQL Server或Oracle(也许Nigel可以提供PL-SQL示例)......那么Nigel是正确的。 这只适用于三个依赖项深度,但可以修改为任何所需深度。它并不是最美观的东西......但它是功能性的...
select
so.name + case when so.xtype='P' then ' (Stored Proc)' when so.xtype='U' then ' (Table)' when so.xtype='V' then ' (View)' else ' (Unknown)' end as EntityName,
so2.name + case when so2.xtype='P' then ' (Stored Proc)' when so2.xtype='U' then ' (Table)' when so2.xtype='V' then ' (View)' else ' (Unknown)' end as FirstDependancy,
so3.name + case when so3.xtype='P' then ' (Stored Proc)' when so3.xtype='U' then ' (Table)' when so3.xtype='V' then ' (View)' else ' (Unknown)' end as SecondDependancy,
so4.name + case when so4.xtype='P' then ' (Stored Proc)' when so4.xtype='U' then ' (Table)' when so4.xtype='V' then ' (View)' else ' (Unknown)' end as ThirdDependancy
from
sysdepends sd
inner join sysobjects as so on sd.id=so.id
left join sysobjects as so2 on sd.depid=so2.id
left join sysdepends as sd2 on so2.id=sd2.id and so2.xtype not in ('S','PK','D')
left join sysobjects as so3 on sd2.depid=so3.id and so3.xtype not in ('S','PK','D')
left join sysdepends as sd3 on so3.id=sd3.id and so3.xtype not in ('S','PK','D')
left join sysobjects as so4 on sd3.depid=so4.id and so4.xtype not in ('S','PK','D')
where so.xtype = 'P' and left(so.name,2)<>'dt'
group by so.name, so2.name, so3.name, so4.name, so.xtype, so2.xtype, so3.xtype, so4.xtype
存储过程在哪个数据库中?Oracle、SQL Server 还是其他什么?
根据评论进行编辑: 鉴于您正在使用 Oracle,可以看一下 TOAD。我使用其中的一个功能叫做代码路线图,它允许您以图形方式显示数据库中的 PL/SQL 依赖关系。它可以运行在仅代码模式下,显示运行时调用堆栈依赖关系,或者在代码加数据模式下运行,在这种模式下,它还会显示您的代码所涉及的数据库对象(表、视图、触发器)。
(注意-我是 TOAD 用户,并没有从中获得任何好处)
如何查找数据库对象的依赖链 (MS SQL Server 2000(?)+) 作者:Jacob Sebastian
每次需要部署新报表或修改现有报表时,需要知道哪些数据库对象依赖于给定的报表存储过程。有时报表非常复杂,每个存储过程可能有数十个依赖对象,每个依赖对象可能又依赖其他数十个对象。
他需要一种递归查找给定存储过程的所有依赖对象的方法。我编写了一个使用 CTE 的递归查询来实现这一点。
逆向工程中最好的工具是 APEX。它非常出色。它甚至可以追踪到 .NET 程序集并告诉你过程在哪里被使用。它绝对是同类产品中最深入的一个。RedGate有其他很棒的工具,但在这种情况下不如APEX。