问题描述
在文档中看到这部分的描述,不过有一个疑点不是很确认,于是验证了一下。
如果一个用户启用了版本,用户执行某个过程或函数时,如果在当前版本中找不到,自动会去父版本寻找,如果还找不到会去祖先版本中寻找,一直到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
可以看到,在当前版本中删除对象后,父版本中对象仍然存在,但是继承关系中断,而当前版本的子版本也不可能再次继承该过程,当然版本中可以创建同名的对象,但是已经和父版本没有关系了。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。