Oracle Editions機能についてのメモ


## Oracle Editionsとは

Oracleオブジェクトのバージョニングを行う機能。
開発などで、一時的にビューやプロシージャの変更をしたい場合に使用する。

- 変更はエディションという単位で管理する。
- Oracle11gR2より導入。
- エディションに対応しているスキーマオブジェクトタイプは以下の通り。
  ※その他のスキーマオブジェクトタイプは全てエディションに非対応。
  - SYNONYM
  - VIEW
  - PL/SQLオブジェクト型  
    (FUNCTION,LIBRARY,PACKAGEおよびPACKAGE BODY,PROCEDURE,TRIGGER,TYPEおよびTYPE BODY)
- ユーザ接続時のエディション（デフォルトエディション）は設定で変更することが出来る。
- インストール直後から、エディション'ORA$BASE'が設定されている。(ベースエディション)
 

## 内容

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

- テストユーザの作成
- 新しいエディションの作成
- エディションを使用するユーザに権限を付加
- テストユーザに接続し、エディションの確認
- ベースエディションにテスト用プロシージャ作成
- 作成した新しいエディションにテスト用プロシージャ作成
- エディションを切り替えて動作を確認
- デフォルトエディション変更
- エディション削除


## 動作確認

### テストユーザ作成

``` sql
-- テスト用テーブルスペース「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
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
SQL> alter user test01 enable editions;
ユーザーが変更されました。

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

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

``` sql
SQL> conn test01/oracle
接続されました。
SQL> show edition;
EDITION
---------
ORA$BASE
```

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

``` sql
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
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
SQL> alter session set edition=ORA$BASE;
セッションが変更されました。

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

SQL> exec TEST_PROC;
Edition 01
```

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

``` sql
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
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
SQL> drop edition ORA$BASE;
drop edition ORA$BASE
             *
行1でエラーが発生しました。:
ORA-38805: エディションが使用中です
```