Edited at

Oracle Editions機能についてのメモ

More than 3 years have passed since last update.


Oracle Editionsとは

Oracleオブジェクトのバージョニングを行う機能。

開発などで、一時的にビューやプロシージャの変更をしたい場合に使用する。


  • 変更はエディションという単位で管理する。

  • Oracle11gR2より導入。

  • エディションに対応しているスキーマオブジェクトタイプは以下の通り。
    ※その他のスキーマオブジェクトタイプは全てエディションに非対応。


    • SYNONYM

    • VIEW

    • PL/SQLオブジェクト型

      (FUNCTION,LIBRARY,PACKAGEおよびPACKAGE BODY,PROCEDURE,TRIGGER,TYPEおよびTYPE BODY)



  • ユーザ接続時のエディション(デフォルトエディション)は設定で変更することが出来る。

  • インストール直後から、エディション'ORA$BASE'が設定されている。(ベースエディション)


内容

以下の手順で「Oracle Editions」の動作を確認する。


  • テストユーザの作成

  • 新しいエディションの作成

  • エディションを使用するユーザに権限を付加

  • テストユーザに接続し、エディションの確認

  • ベースエディションにテスト用プロシージャ作成

  • 作成した新しいエディションにテスト用プロシージャ作成

  • エディションを切り替えて動作を確認

  • デフォルトエディション変更

  • エディション削除


動作確認


テストユーザ作成

-- テスト用テーブルスペース「TESTTS01」作成

CREATE BIGFILE TABLESPACE TESTTS01 DATAFILE '/u01/app/oracle/oradata/TEST/testts01.dbf' SIZE 20M
AUTOEXTEND ON NEXT 500K MAXSIZE UNLIMITED
SEGMENT SPACE MANAGEMENT AUTO;

-- テスト用プロファイル「TESTPF01」作成
CREATE PROFILE TESTPF01
LIMIT FAILED_LOGIN_ATTEMPTS UNLIMITED
PASSWORD_LIFE_TIME UNLIMITED;

-- テスト用ユーザ「TEST01」作成
CREATE USER TEST01 IDENTIFIED BY oracle
DEFAULT TABLESPACE TESTTS01
TEMPORARY TABLESPACE TEMP
PROFILE TESTPF01
QUOTA UNLIMITED ON TESTTS01;

-- 権限付与
GRANT CREATE SESSION, ALTER SESSION TO TEST01;
GRANT CREATE TABLE,CREATE SEQUENCE,CREATE SYNONYM,CREATE VIEW TO TEST01;

-- 権限確認
SELECT * FROM SESSION_PRIVS order by 1;


新しいエディションの作成

SQL> select * from DBA_EDITIONS;

EDITION_NAME PARENT_EDITION_NAME USABLE
------------- -------------------- -------
ORA$BASE YES

SQL> create edition new_edt as child of ORA$BASE;
エディションが作成されました。

SQL> select * from DBA_EDITIONS;
EDITION_NAME PARENT_EDITION_NAME USABLE
------------- -------------------- -------
ORA$BASE YES
NEW_EDT ORA$BASE YES


エディションを使用するユーザに権限を付加

SQL> alter user test01 enable editions;

ユーザーが変更されました。

SQL> grant use on edition new_edt to test01;
権限付与が成功しました。


テストユーザに接続し、エディションの確認

SQL> conn test01/oracle

接続されました。
SQL> show edition;
EDITION
---------
ORA$BASE


ベースエディションにテスト用プロシージャ作成

SQL> conn test01/oracle

接続されました。
SQL> show edition;
EDITION
---------
ORA$BASE

set serveroutput on
SQL> CREATE OR REPLACE PROCEDURE TEST_PROC AS
BEGIN
dbms_output.put_line('Edition 01');
END;
/
プロシージャが作成されました。

SQL> exec TEST_PROC;
Edition 01

PL/SQLプロシージャが正常に完了しました。


作成した新しいエディションにテスト用プロシージャ作成

SQL> alter session set edition=new_edt;

セッションが変更されました。

SQL> show edition
EDITION
------------------------------
NEW_EDT

SQL> CREATE OR REPLACE PROCEDURE TEST_PROC AS
BEGIN
dbms_output.put_line('Edition 02');
END;
/
プロシージャが作成されました。

SQL> exec TEST_PROC;
Edition 02
PL/SQLプロシージャが正常に完了しました。


エディションを切り替えて動作を確認

SQL> alter session set edition=ORA$BASE;

セッションが変更されました。

SQL> show edition
EDITION
------------------------------
ORA$BASE

SQL> exec TEST_PROC;
Edition 01


デフォルトエディションの変更

SQL> ALTER DATABASE DEFAULT EDITION=new_edt

データベースが変更されました。

SQL> conn test01/oracle
SQL> show edition
EDITION
------------------------------
NEW_EDT

SQL> conn / as sysdba
SQL> ALTER DATABASE DEFAULT EDITION=ORA$BASE;
データベースが変更されました。

SQL> conn test01/oracle
SQL> show edition;
EDITION
------------------------------
ORA$BASE

SQL> conn / as sysdba
SQL> SELECT SYS_CONTEXT('USERENV', 'CURRENT_EDITION_NAME') CURRENT_EDITION_NAME FROM DUAL;
CURRENT_EDITION_NAME
---------------------
ORA$BASE
SQL> SELECT SYS_CONTEXT('USERENV', 'SESSION_EDITION_NAME') SESSION_EDITION_NAME FROM DUAL;
SESSION_EDITION_NAME
---------------------
ORA$BASE

ALTER DATABASE DEFAULT EDITION=NEW_EDT;

SQL> conn / as sysdba
接続されました。
SQL> SELECT SYS_CONTEXT('USERENV', 'CURRENT_EDITION_NAME') CURRENT_EDITION_NAME FROM DUAL;
CURRENT_EDITION_NAME
---------------------
NEW_EDT
SQL> SELECT SYS_CONTEXT('USERENV', 'SESSION_EDITION_NAME') SESSION_EDITION_NAME FROM DUAL;
SESSION_EDITION_NAME
---------------------
NEW_EDT


エディションの削除

SQL> select * from DBA_EDITIONS;

EDITION_NAME PARENT_EDITION_NAME USABLE
------------- -------------------- -------
ORA$BASE YES
NEW_EDT ORA$BASE YES

SQL> drop edition new_edt ;
drop edition new_edt
*
1でエラーが発生しました。:
ORA-38811: 実際のオブジェクトを持つエディションを削除するには、CASCADEオプションが必要です

SQL> drop edition new_edt cascade;
エディションが削除されました。

SQL> select * from DBA_EDITIONS;
EDITION_NAME PARENT_EDITION_NAME USABLE
------------- -------------------- -------
ORA$BASE YES


ちなみに

SQL> drop edition ORA$BASE;

drop edition ORA$BASE
*
1でエラーが発生しました。:
ORA-38805: エディションが使用中です