发表于: 2005.05.01 23:08
分类: 读书笔记
出处: http://yangtingkun.itpub.net/post/468/28441
---------------------------------------------------------------
一些对象的定义会参考其他的对象。比如,存储过程、视图等对象会参考表、视图、过程等。这一章主要描述了方案对象的依赖关系以及Oracle是如何自动跟踪和管理这些依赖关系的。
数据库中每个对象都有一个状态:如果状态是VALID,则这个对象已经被编译过,可以立即被使用。如果状态是INVALID,则对象在使用前必须重新编译。
只有参考其他对象的对象的状态才可能是INVALID,对于表、序列和同义词,状态总是VALID。
Oracle会自动记录数据库中的变化,并将相关对象的状态记录在数据字典中。状态的记录是一个递归过程,不仅是发生变化的对象的直接参考对象的状态发生变化,而且间接参考对象也同样会发生状态的变化。
当Oracle运行一条SQL语句或一个存储过程时,Oracle会自动检查所有语句直接参考或间接参考的对象的状态。
如果所有的对象的状态都是VALID,则Oracle立即执行相应的语句。
如果有的对象的状态是INVALID,则Oracle会自动尝试对INVALID对象进行编译,如果所有INVALID对象都可以编译成功,则Oracle会执行相应的语句,否则,Oracle会报错。
对于远端数据库过程的依赖关系,Oracle通过timestamp checking或signature checking的方法进行检查。
timestamp checking方法:Oracle会对比本数据库中保存的远端对象的修改时间戳和这个对象在远端数据库的数据字典中是否一致,如果不一致则说明这个对象进行过修改。
signature checking方法:Oracle会检查远端过程的名称、参数的类型和参数的模式(IN/OUT/IN OUT),并把这三个signature的改变作为判断远端对象依赖关系的标准。











