我们在工作中遇到大量遗留存储过程的问题.你们推荐任何可以帮助你更好地理解这些程序的工具吗?某种逆向工程,它识别过程间依赖性和/或过程与表依赖性.可以是免费或商业工具.
谢谢!
比"依赖性跟踪器"更便宜的解决方案是数据字典表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实例来开发和测试任何东西.