在文档中看到这部分的描述,不过有一个疑点不是很确认,于是验证了一下。
如果一个用户启用了版本,用户执行某个过程或函数时,如果在当前版本中找不到,自动会去父版本寻找,如果还找不到会去祖先版本中寻找,一直到ORA$BASE中都无法找到,才回报错对象不存在。
但是用户明确的删除操作会使得继承关系中断。一个用户如果删除当前版本中的对象,那么父版本中的对象并不会删除,只不过这个对象在当前版本中不在可见。
看到文档上的这个描述,我的疑问是,对于当前版本的子版本,能否判断父版本中对象是被删除,还是根本没有创建。换句话说,当前版本删除对象后,自版本能否绕过当前版本从父版本处继承对象。
-bash-3.2$ sqlplus test/test SQL*Plus: Release 11.2.0.2.0 Production ON Thu Sep 15 21:04:58 2011 Copyright (c) 1982, 2010, Oracle. ALL rights reserved. Connected TO: Oracle DATABASE 11g Enterprise Edition Release 11.2.0.2.0 - Production WITH the Partitioning, OLAP, DATA Mining AND REAL Application Testing options SQL> SET pages 100 LINES 120 SQL> CREATE USER u1 IDENTIFIED BY u1 DEFAULT tablespace users enable editions; USER created. SQL> GRANT CONNECT, resource, dba TO u1; GRANT succeeded. SQL> conn u1/u1 Connected. SQL> SELECT sys_context('USERENV', 'CURRENT_EDITION_NAME') FROM dual; SYS_CONTEXT('USERENV','CURRENT_EDITION_NAME') ------------------------------------------------------------------------ ORA$BASE SQL> CREATE FUNCTION f1 RETURN varchar2 AS 2 BEGIN 3 RETURN 'Edition ORA$BASE'; 4 END; 5 / FUNCTION created. SQL> SELECT f1 FROM dual; F1 ----------------------------------------------------------------- Edition ORA$BASE SQL> CREATE FUNCTION f2 RETURN varchar2 AS 2 BEGIN 3 RETURN 'Edition ORA$BASE'; 4 END; 5 / FUNCTION created. SQL> SELECT f2 FROM dual; F2 ------------------------------------------------------------------ Edition ORA$BASE SQL> CREATE edition e1; Edition created. SQL> ALTER SESSION SET edition = e1; SESSION altered. SQL> SELECT f1 FROM dual; F1 ------------------------------------------------------------------- Edition ORA$BASE SQL> SELECT f2 FROM dual; F2 ------------------------------------------------------------------- Edition ORA$BASE SQL> DROP FUNCTION f1; FUNCTION dropped. SQL> SELECT f1 FROM dual; SELECT f1 FROM dual * ERROR at line 1: ORA-00904: "F1": invalid identifier SQL> SELECT sys_context('USERENV', 'CURRENT_EDITION_NAME') FROM dual; SYS_CONTEXT('USERENV','CURRENT_EDITION_NAME') ---------------------------------------------------------------- E1 SQL> CREATE edition e2 AS child OF e1; Edition created. SQL> ALTER SESSION SET edition = e2; SESSION altered. SQL> SELECT f1 FROM dual; SELECT f1 FROM dual * ERROR at line 1: ORA-00904: "F1": invalid identifier SQL> SELECT f2 FROM dual; F2 ----------------------------------------------------------------------- Edition ORA$BASE SQL> ALTER SESSION SET edition = ora$base; SESSION altered. SQL> SELECT f1 FROM dual; F1 ----------------------------------------------------------------------- Edition ORA$BASE |
可以看到,在当前版本中删除对象后,父版本中对象仍然存在,但是继承关系中断,而当前版本的子版本也不可能再次继承该过程,当然版本中可以创建同名的对象,但是已经和父版本没有关系了。