Dの小部屋

忘れやすい私のメモ帳

Oracle Editions機能についてのメモ

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: エディションが使用中です