细粒度依赖(二)依赖关系导致的对象失效

上次说到可以通过数据字典找到Oracle数据对象的依赖关系,从而做好DDL操作的关联操作,以避免数据库对象失效。

在Oracle10g以及更早的版本中,依赖关系是以程序单元的粒度进行跟踪的,比如一张表的一个字段被修改,即使程序中没有用到这个字段,也会失效。

从Oracle11g开始,细粒度依赖已经优化到单元中的元素,比如上述的情况中,程序只在引用字段被修改时才会失效。

比如我有一张表T_CUR2,有ID和NAME两个字段

细粒度依赖(二)依赖关系导致的对象失效

表被V_T_CUR引用,其中ID字段设为别名ID2

细粒度依赖(二)依赖关系导致的对象失效

而V_T_CUR又被个存储过程P_DEPENDENCY1引用

细粒度依赖(二)依赖关系导致的对象失效

同时,基表T_CUR2又同时被4个存储过程P_DEPENDENCY2、P_DEPENDENCY3、P_DEPENDENCY4、P_DEPENDENCY5引用,4个存储过程的区别仅在于COUNT的字段不一样:

细粒度依赖(二)依赖关系导致的对象失效

细粒度依赖(二)依赖关系导致的对象失效

细粒度依赖(二)依赖关系导致的对象失效

细粒度依赖(二)依赖关系导致的对象失效

这些对象刚开始都是有效的:

细粒度依赖(二)依赖关系导致的对象失效细粒度依赖(二)依赖关系导致的对象失效


现在对T_CUR2表的ID字段进行DDL操作,看下其他对象的状态:

细粒度依赖(二)依赖关系导致的对象失效

我们发现表结构修改后,被依赖的视图和存储过程状态如下:

视图V_T_CUR,失效,因为引用了被修改的字段;

存储过程P_DEPENDENCY1,失效,因为引用了已经失效的V_T_CUR视图;

存储过程P_DEPENDENCY2,有效,COUNT(*)按常规理解应该是可能会解析到ID字段引用,有点出乎意料;

存储过程P_DEPENDENCY3,失效,COUNT(A.ID)引用了被修改的ID字段;

存储过程P_DEPENDENCY4,失效,COUNT(1)按常规理解应该是没用到ID字段,也有点出乎意料;

存储过程P_DEPENDENCY5,有效,COUNT(DISTINCT NAME)没有引用被修改的ID字段。

居然意外得出一个用COUNT(*)好还是COUNT(xxx)好的佐证。