存储过程逆向工程

时间:2008-09-16 06:54:51

标签: database stored-procedures reverse-engineering legacy

我们遇到了大量遗留存储过程的问题。你们推荐任何可以帮助你更好地理解这些程序的工具吗?某种逆向工程,它识别过程间依赖性和/或过程与表依赖性。可以是免费或商业工具。

谢谢!

8 个答案:

答案 0 :(得分:6)

比“依赖性跟踪器”更便宜的解决方案是数据字典表sys.sql_dependencies,可以从数据字典中查询该数据。 Oracle有一个具有类似功能的数据字典视图,名为DBA_DEPENDENCIES(加上等效的USER_和ALL_视图)。使用其他数据字典表(sys.tables / DBA_TABLES)等,您可以生成对象依赖性报告。

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

这是sys.sql_dependencies上的递归CTE示例。它将返回每个依赖项的条目及其深度。对于每个依赖关系,项目可以出现不止一次,可能在不同的深度。我没有可用于在DBA_DEPENDENCIES上构建CONNECT BY查询的Oracle实例,因此欢迎具有编辑权限,时间和专业知识的任何人注释或编辑此答案。

另请注意sys.sql_dependencies您可以从referenced_minor_id获取列引用。这可以用于(例如)确定哪些列实际上在来自暂存区域的ETL sprocs中使用来自源的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递归查询吗?请注意,这是特定于SQL服务器的,问题所有者已经明确表示他正在使用Oracle。我没有正在运行的Oracle实例来开发和测试任何东西。

答案 1 :(得分:4)

Redgate有一个名为SQL Dependency Tracker的相当昂贵的产品似乎符合要求。

答案 2 :(得分:3)

我认为Red Gate Dependency Tracker mentioned by rpetrich是一个不错的解决方案,它运作良好,Red Gate有30天的试用期(理想情况下,你可以进行取证)。

我还会考虑隔离系统并运行 SQL Profiler,它将显示表中的所有SQL操作。这通常是构建序列图的良好起点,或者您选择记录这些代码。祝好运!

答案 3 :(得分:1)

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

答案 4 :(得分:1)

存储过程是什么数据库? Oracle,SQL Server,还有什么?

根据评论进行修改:鉴于您正在使用Oracle,请查看TOAD。我在其中使用了一个名为Code Roadmap的功能,它允许您以图形方式显示数据库中的PL / SQL相互依赖性。它可以在仅代码模式下运行,显示运行时调用堆栈依赖项,或Code Plus数据模式,它还显示代码触及的数据库对象(表,视图,触发器)。

(注意 - 我是TOAD用户,并且没有从中获益)

答案 5 :(得分:1)

这不是真正的深入或彻底,但我认为如果您使用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

答案 6 :(得分:1)

How to find the dependency chain of a database object(MS SQL Server 2000(?)+) 雅各布塞巴斯蒂安

  

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

     

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

答案 7 :(得分:0)

逆向工程的最佳工具是APEX。太奇妙了。它甚至可以跟踪.NET程序集并告诉您使用proc的位置。它是迄今为止最深的产品。 RedGate有很多其他工具,但在这种情况下不是。