版本中刪除物件導致當前和子版本中物件不可見

yangtingkun發表於2011-09-15

在文件中看到這部分的描述,不過有一個疑點不是很確認,於是驗證了一下。

 

 

如果一個使用者啟用了版本,使用者執行某個過程或函式時,如果在當前版本中找不到,自動會去父版本尋找,如果還找不到會去祖先版本中尋找,一直到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

可以看到,在當前版本中刪除物件後,父版本中物件仍然存在,但是繼承關係中斷,而當前版本的子版本也不可能再次繼承該過程,當然版本中可以建立同名的物件,但是已經和父版本沒有關係了。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-707622/,如需轉載,請註明出處,否則將追究法律責任。

相關文章