Oracle

Oracle RDBMS 11 中的表可以有多個版本視圖嗎

  • August 1, 2019

Oracle 數據庫中的一個表ABC可以有多個版本視圖嗎?

我有一個版本視圖ABC(從 table 創建ABC),顯示舊版本OLD_EDITION_1在表中edition_nameUSER_OBJECTS我正在嘗試創建一個以ABC版本名稱命名的新版本視圖NEW_EDITION_2

每個版本中的每個表只能有一個版本視圖。

解釋一下,一些背景。基於版本的重定義 (EBR) 帶來了兩個新的模式對象:

  • 版本
  • 編輯視圖

版本擴展了對象的命名空間。這為模式添加了前綴。因此,從 11.2 開始,Oracle 數據庫中對象的完全限定名稱是:

edition_name.schema_name.object_name

但是您不能明確引用 edition_name。它是您的會話設置的一部分。當您創建可編輯對象時,它會進入您目前的版本。

例如,以下創建一個新使用者, editions 啟用它,創建表“abc”和編輯視圖“ABC”:

grant create session, create table, create view, unlimited tablespace to
 usr identified by usr;
alter user usr enable editions;

create edition e1;

grant use on edition e1 to usr;

conn usr/usr

create table "abc" (
 c1 int, 
 c2 int
);
create or replace editioning view abc as 
 select * from "abc";

select object_name, object_type, edition_name
from   user_objects;

OBJECT_NAME   OBJECT_TYPE   EDITION_NAME   
abc           TABLE         <null>         
ABC           VIEW          ORA$BASE     

如果您嘗試在版本 e1 中創建視圖的新版本,您將收到錯誤消息:

create or replace editioning view e1.abc as 
 select c1 from "abc";

ORA-01917: user or role 'E1' does not exist

這是因為您目前使用的是 ora$base 版本。每個數據庫的預設值。

要創建視圖的新版本,您需要將會話切換到版本 e1:

alter session set edition = e1;

create or replace editioning view abc as 
 select * from "abc";

select object_name, object_type, edition_name
from   user_objects;

OBJECT_NAME   OBJECT_TYPE   EDITION_NAME   
abc           TABLE         <null>         
ABC           VIEW          E1   

select object_name, object_type, edition_name
from   user_objects_ae;

OBJECT_NAME   OBJECT_TYPE   EDITION_NAME   
abc           TABLE         <null>         
ABC           VIEW          E1             
ABC           VIEW          ORA$BASE     

如您所見,您現在有兩個視圖“ABC”。每個版本一個。

如果仍然在 E1 中,您嘗試使用“abc”創建新的編輯視圖,您將收到錯誤消息:

create or replace editioning view abc_new as 
 select * from "abc";

ORA-42300: an Editioning view is already defined on this table

假設您使用的是 Oracle 11g 第 2 版:

您的編輯視圖名稱和表名稱不應相同。來自https://blogs.oracle.com/oraclemagazine/edition-based-redefinition%2c-part-2的事件順序是:

  1. Alter table ABC rename to ABC_RT;
  2. create editioning view ABC as select /* column list here */ from ABC_RT;
  3. 然後創建您的新版本,將該版本設為目前版本,然後創建一個新的版本視圖 ABC。

您還需要查看數據字典視圖USER_OBJECTS_AE,而不是USER_OBJECTS

引用自:https://dba.stackexchange.com/questions/213903