细粒度依赖(一)通过数据字典找到数据库对象之间的引用关系

开发过程中,我们经常碰到这样的问题,一个好好的程序某一天忽然报错了。

重新编译,发现程序里引用的某个对象不存在或表结构被改了,往往是在团队合作时,由于业务需要某个成员修改了结构,但是不清楚哪些地方引用了这个对象,因此没有处理好善后工作,最后搞得焦头烂额。

事实上,ORACLE提供了细粒度依赖的数据字典*_dependencies,可以找出引用关系来解决这个麻烦。

先看下数据字典的结构:

细粒度依赖(一)通过数据字典找到数据库对象之间的引用关系

从表结构可以看出,这个视图里包含了对远程数据库对象的引用关系,以下是我的一个数据库下面远程对象的引用关系:

细粒度依赖(一)通过数据字典找到数据库对象之间的引用关系

下图是我的一个生产数据库中对象类型的引用矩阵,这是实际用到的引用关系,并不涵盖Oracle支持的所有引用关系。

其中DEPENDENCY_TYPE分为HARD和REF两种,对于这2种类型的解释是REF for REF dependency HARD otherwise(引用关系是REF,其余都是HARD)。

细粒度依赖(一)通过数据字典找到数据库对象之间的引用关系

了解了这个数据字典以后,我们就会经常用到2个查询:

1.查找哪些对象依赖于(引用了)被我修改的表

SElECT RPAD(' ',3*(LEVEL-1))||A.OWNER||'.'||A.NAME,A.TYPE from DBA_DEPENDENCIES A
 connect by PRIOR TRIM(owner||'.'||name||'$'||type)=TRIM(referenced_owner||'.'||referenced_name||'$'||referenced_type)

  START WITH referenced_owner='CHARISMA' AND referenced_name='ST_SYSUSER' AND referenced_type='TABLE';

细粒度依赖(一)通过数据字典找到数据库对象之间的引用关系

2.我的一个程序依赖于(引用了)哪些数据库对象?

SELECT RPAD(' ',3*(LEVEL-1))||A.referenced_owner||'.'||A.referenced_name,A.referenced_type from DBA_DEPENDENCIES A
 connect by PRIOR TRIM(referenced_owner||'.'||referenced_name||'$'||referenced_type)=TRIM(owner||'.'||name||'$'||type)

  START WITH owner='CZFX' AND name='SP_CZ_SJTS_DATA_MAKE' AND type='PROCEDURE';

细粒度依赖(一)通过数据字典找到数据库对象之间的引用关系

实际使用中,可以基于DBA_DEPENDENCIES视图构建所有数据库之间的对象应用关系拓扑,然后用DDL触发器捕捉DDL操作,从而搭建依赖关系管理系统。将在后期的文章中进行详细描述。