-
09-06-2019 - |
题
我们有问题数量庞大的遗留存储程序的工作。你们建议任何工具可以帮助更好地了解这些程序?某种逆向工程,indentifies间的依赖关系的过程和/或程序与表依赖关系。可以是免费或商业工具。
谢谢!
解决方案
展鹏有一个相当昂贵的产品,叫做 SQL依赖跟踪器 似乎满足的要求。
其他提示
更便宜的解决方案'的依赖跟踪'的数据字典表sys.sql_dependencies其从这种数据可以查询由数据字典。Oracle数据字典查具有类似功能的所谓DBA_DEPENDENCIES(加上相当于USER_和ALL_的意见)。使用的其他数据字典的表(sys.表/DBA_TABLES)等。你可以产生的对象的依赖性报告。
如果你感觉特别希望您可以使用递归查询(Oracle连接或SQL服务器共同表表达)建立一个完整的对象的依赖关系图。
这里的一个实例是递归CTE sys.sql_dependencies.它将返回的一个条目的每一个依赖与其深度。项目可能会发生多次,可能在不同的深度,对于每一个依赖性的关系。我没有工作Oracle instance手建立一个连接通过查询在DBA_DEPENDENCIES因此,任何人都有编辑的特权及的时间和专业知识是值得欢迎的注解或编辑这个答案。
注意到还有 sys.sql_dependencies
你可以把列参考资料 referenced_minor_id
.这可能是使用(例如)确定哪些列已实际用于ETL sprocs从一个临时区域的副本,该数据库表从源与列于实际使用。
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 instance后一个连接通过递归查询这里?注意,这是SQL服务器的特定问题所有人已明确表示,他使用Oracle。我没有一个运行Oracle instance手开发和测试什么。
我认为的 红门的依赖跟踪所提到的rpetrich 是一个体面的解决方案,它的工作以及和红门已有30天的试用期(理想的情况是足够长的时间你做你的法医学).
我还要考虑分离的系统和运行的 SQL分析器显示你的所有SQL行动表.这往往是一个 好的起点,为建立一个序列图或但你选择来文,这些代码.祝你好运!
展鹏SQL Doc.所产生的文件中包含的交叉引用的依赖性的信息。例如,每个表格,列出了意见,储存程序,触发器等引用该表。
什么样的数据库存储的过程中?Oracle、SQL服务器,是其他什么东西?
编辑基础上的评论意见: 给你使用Oracle那么,看一看 蟾蜍.我用一个功能,在它称为代码的路线图,它可以让你以图形方式显示PL/SQL interdependancies内的数据库。它可以运行在代码中仅有模式,显示出运行时呼堆依赖关系,或者代码的数据模式,它还显示了你的数据库对象(表、视,触发器),触及你的代码。
(注-我是一只癞蛤蟆用户和收益没有受益的参照它)
这不是真正的深层或彻底的,但我认为,如果你正在使用MS SQL服务器或Oracle(也许奈杰尔可以帮助PL-SQL样品)...奈杰尔是对的东西。这只有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
如何找到依赖关系链的一个数据库对象 (MS SQL Server2000年(?)+) 雅各布塞巴斯蒂安
每次他需要部署新的报告或修改现有的 报告,他需要知道什么是数据库的对象,这取决于 给定的报告储存的程序。有些时候的报告都非常 复杂的,每个存储程序可能会有几十个依赖 对象,每一个依赖对象可以根据其他几十个 对象。
他需要一种递归找到的所有根据的对象 鉴于储存的程序。我写了一个递归查询使用CTE实现 这一点。
最好的一个工具,用于逆向工程的顶点。其惊人。它甚至可以跟踪。网集会,告诉你在哪里处的使用。其迄今为止最深的产品。展鹏具有很大的其他工具,但不是在这种情况。