Database 存储过程逆向工程

Database 存储过程逆向工程,database,stored-procedures,reverse-engineering,legacy,Database,Stored Procedures,Reverse Engineering,Legacy,我们在工作中遇到了大量遗留存储过程的问题。你们推荐什么工具可以帮助更好地理解这些程序?确定过程间依赖关系和/或过程与表依赖关系的某种逆向工程。可以是免费或商业工具 谢谢 Redgate有一款相当昂贵的产品,名为,似乎可以满足要求。我认为这是一个不错的解决方案,它运行良好,并且Redgate有30天的试用期(理想情况下,足够你进行取证) 我也会考虑隔离系统并运行 SQL探查器,它将显示所有的表上的SQL动作。这通常是构建序列图或记录这些代码的良好起点。祝你好运 红门SQL文档。生成的文档包括交叉引

我们在工作中遇到了大量遗留存储过程的问题。你们推荐什么工具可以帮助更好地理解这些程序?确定过程间依赖关系和/或过程与表依赖关系的某种逆向工程。可以是免费或商业工具


谢谢

Redgate有一款相当昂贵的产品,名为,似乎可以满足要求。

我认为这是一个不错的解决方案,它运行良好,并且Redgate有30天的试用期(理想情况下,足够你进行取证)


<>我也会考虑隔离系统并运行<强> SQL探查器,它将显示所有的表上的SQL动作<强>。这通常是构建序列图或记录这些代码的良好起点。祝你好运

红门SQL文档。生成的文档包括交叉引用的依赖项信息。例如,对于每个表,它列出了引用该表的视图、存储过程、触发器等

存储过程在哪个数据库中?甲骨文,SQL Server,还有别的吗

根据评论编辑:如果您正在使用Oracle,请查看。我在其中使用了一个称为代码路线图的特性,它允许您以图形方式显示数据库中的PL/SQL相互依赖关系。它可以在仅代码模式下运行,显示运行时调用堆栈依赖关系,也可以在代码加数据模式下运行,其中还显示代码所涉及的数据库对象(表、视图、触发器)


(注意-我是一个蟾蜍用户,引用它并没有任何好处)

比“依赖项跟踪器”更便宜的解决方案是数据字典表sys.sql\u dependencies,可以从数据字典中查询此数据。Oracle有一个具有类似功能的数据字典视图,称为DBA_依赖项(加上等效的用户视图和所有视图)。使用其他数据字典表(sys.tables/DBA_表)等,您可以生成对象依赖关系报告

如果您特别感兴趣,可以使用递归查询(Oracle CONNECT BY或SQL Server公共表表达式)来构建完整的对象依赖关系图

下面是sys.sql\u依赖项上的递归CTE示例。它将为每个依赖项返回一个条目及其深度。对于每个依赖关系,项可以出现多次,可能出现的深度不同。我手头没有一个可以运行的Oracle实例来构建DBA_依赖项上的CONNECT BY查询,因此欢迎任何具有编辑权限、时间和专业知识的人对这个答案进行注释或编辑

另请注意,对于
sys.sql\u dependencies
,您可以从
referenced\u minor\u id
获取列引用。这可以用来(例如)确定在ETL存储过程中,从一个临时区域中实际使用了哪些列,该临时区域具有来自源的DB表的副本,其中的列比实际使用的多

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 recursive查询?请注意,这是特定于SQL server的,问题所有者已明确表示他正在使用Oracle。我手头没有一个运行中的Oracle实例来开发和测试任何东西。

这不是真正深入或彻底的,但我认为如果您使用的是MS SQL Server或Oracle(也许Nigel可以帮助编写PL-SQL示例)…Nigel已经掌握了一些东西。这只涉及3个依赖项,但可以修改为您需要的深度。这不是最漂亮的东西…但它很实用

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
选择
so.name+case when so.xtype='P'then'(存储过程)'when so.xtype='U'then'(表)'when so.xtype='V'then'(视图)'else'(未知)'结束为EntityName,
so2.name+当so2.xtype='P'然后'(存储过程)'当so2.xtype='U'然后'(表)'当so2.xtype='V'然后'(视图)'其他'(未知)'作为第一依赖项结束时的情况,
so3.name+case when so3.xtype='P'then'(存储过程)'when so3.xtype='U'then'(表)'when so3.xtype='V'then'(视图)'else'(未知)'作为第二依赖项结束,
so4.name+case when so4.xtype='P'then'(存储过程)'when so4.xtype='U'then'(表)'when so4.xtype='V'then'(视图)'else'(未知)'作为第三个独立性结束
从…起
SYSSD
sd.id=so.id上的内部连接系统对象
在sd.depid=so2.id上将sysobjects作为so2左连接
左join sysdependens as sd2 on so2.id=sd2.id,so2.xtype不在('S','PK','D'))
在sd2.depid=so3.id和so3.xtype上以so3的形式左键连接sysobjects不在('S','PK','D'))
左join sysdependens as sd3 on so3.id=sd3.id和so3.xtype不在('S','PK','D'))
在sd3.depid=so4.id和so4.xtype上以so4的形式左键连接系统对象,不在('S','PK','D')中
其中so.xtype='P'和left(so.name,2)'dt'
按so.name、so2.name、so3.name、so4.name、so.xtype、so2.xtype、so3.xtype、so4.xtype分组

反向工程的最佳工具是APEX。太神奇了。它甚至可以跟踪到.NET程序集,并告诉您进程的使用位置。这是迄今为止同类产品中最深的产品。RedGate还有其他很好的工具,但在本例中没有

(MS SQL Server 2000(?)+) 雅各布·塞巴斯蒂安

每次他需要部署新报表或修改现有报表时 报告时,他需要知道所依赖的数据库对象是什么 给定的报表存储过程。有些时候,这些报道非常有趣 复杂,每个存储过程可能有几十个依赖项 对象和每个从属对象可能依赖于其他几十个对象 对象

他需要一种方法来递归地找到一个对象的所有依赖对象 给定的存储过程。我用CTE编写了一个递归查询来实现 这个


我不知道。但我认为它不是很友好。不过我要看看。