Oracle
Oracle RDBMS 11 中的表可以有多個版本視圖嗎
Oracle 數據庫中的一個表
ABC
可以有多個版本視圖嗎?我有一個版本視圖
ABC
(從 table 創建ABC
),顯示舊版本OLD_EDITION_1
在表中edition_name
。USER_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的事件順序是:
Alter table ABC rename to ABC_RT;
create editioning view ABC as select /* column list here */ from ABC_RT;
- 然後創建您的新版本,將該版本設為目前版本,然後創建一個新的版本視圖 ABC。
您還需要查看數據字典視圖
USER_OBJECTS_AE
,而不是USER_OBJECTS