版本中删除对象导致当前和子版本中对象不可见

在文档中看到这部分的描述,不过有一个疑点不是很确认,于是验证了一下。
如果一个用户启用了版本,用户执行某个过程或函数时,如果在当前版本中找不到,自动会去父版本寻找,如果还找不到会去祖先版本中寻找,一直到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

可以看到,在当前版本中删除对象后,父版本中对象仍然存在,但是继承关系中断,而当前版本的子版本也不可能再次继承该过程,当然版本中可以创建同名的对象,但是已经和父版本没有关系了。

This entry was posted in ORACLE and tagged , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *