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