Oracle Database 11g Release 2に関する10の重要なこと – askTom Live -
Point10: Edition-based redefinition 【エディション・ベースの再定義】
オラクル・コーポレーション
サーバー・テクノロジー部門 シニア・テクニカル・アーキテクト兼エバンジェリスト
Thomas(Tom) Kyte (トム・カイト)
( 目次 )
10.Edition-based redefinition 【エディション・ベース の再定義】
エディション・ベースの再定義は、まさにOracle Database 11g R2の目玉機能といえます。
あまりにも重要かつ大きな機能なので、2つ分として数えるだけの価値があると考え、このセッションのタイトルをOracle Database 11g Release 2の「10個の新機能」から「11個の新機能」に変えてしまったほどです。
この機能により、ユーザーがアプリケーションを使用中でも、データベースを止めることなくそのアプリケーションをアップグレードできます。つまり、これまでどうしても避けられなかったダウンタイムがなくなるのです。
エディション・ベースの再定義は、Oracle Database Enterprise Editionだけでなく、Oracle Database Standard Editionでも使える機能です。
以前のバージョンのOracleデータベースでも、初期化パラメータの変更や索引の作成をはじめ、ほとんどの構造の再定義や再構成、そしてデータベースのアップグレードでさえオンラインでおこなえました。
唯一、インスタンスをシャットダウンし、データベース・アクセスを遮断しなくてはならなかったのが、アプリケーションをアップグレードする時です。
PL/SQLの実行中やビューの使用中は、PL/SQLユニットの再コンパイルや、ビューを再作成して権限を変更する操作をおこなえなかったからです。
エディション・ベースの再定義という機能は、ユーザーがバージョン1のアプリケーションを使っている最中に、バージョン2のアプリケーションを設定することを可能にします。
つまり、コードのリプレースをおこなう間、2つのバージョンのコードを、お互いブロックすることなく同時にデータベース内に存在させることができるのです。その間、バージョン1のアプリケーションを見ている人は、バージョン2を目にすることはありません。10個の変更を一度におこない、新しいバージョンに1つのコマンドで切り替えることも可能です。
データベース管理者は、ユーザーが旧バージョンを使っている間にアプリケーションのアップグレードをおこなうことができるので、ダウンタイムがなくなります。
Oracle Database 11g R2では、新たな名前空間としてエディションを作成できます。すべてのオブジェクトは、オブジェクトの所有者、オブジェクト名だけでなく、そのセッションのエディションの3つで参照されるようになりました。
Oracle Database 11g R2でセッションを作成すると、セッションはエディションを表す属性をもちます(デフォルトでは、データベースのデフォルト・エディションになります)。
新しいエディションは、既存のエディションの子として作成され、親エディションのPL/SQLコード、ビュー、シノニムなどのすべての属性を継承します。子エディションは親エディションとまったく同じものですが、追加や修正などの変更がおこなえます。
具体的な動作を見てみましょう。
まず、デモ用のアカウントDEMOを作成して最低限の権限を付与します。
SQL> create user demo
2 identified by demo;
User created.
SQL> grant create session,
2 create procedure
3 to demo;
Grant succeeded.
次に、データベースのコードオブジェクトに対し、複数のエディションを作成します。
SQL> create edition version2
2 as child of ora$base;
Edition created.
ORA$BASEの子エディションとして、VERSION2というエディションを作成しました。
Oracle Database 11g R2では、すべてのデータベースにかならず1つのデフォルト・エディションが存在します。たとえば、インストール直後のデータベースのデフォルト・エディションはORA$BASEです。
ORA$BASEの子エディションであるVERSION2は、最初はデフォルト・エディションORA$BASEの完全なコピーなので、ORA$BASEで正しいことはVERSION2でも同じです。
ここで重要なのは、VERSION2はバーチャルなコピーだということです。CREATE EDITION句は、ORA$BASEのすべてのオブジェクトをエディションVERSION2に物理的にコピーするわけではありません。VERSION2はORA$BASEオブジェクトを指しており、私がエディションVERSION2において、オブジェクトを変更しない限り、ディクショナリの領域を使い始めることはありません。
続いて、アカウントDEMOにVERSION 1のアプリケーションを設定します。
DEMO> create or replace
2 procedure my_procedure
3 as
4 begin
5 dbms_output.put_line
6 ( 'I am version 1.0' );
7 end;
8 /
Procedure created.
DEMO> create or replace
2 procedure my_procedure2
3 as
4 begin
5 my_procedure;
6 end;
7 /
Procedure created.
ここまでは比較的簡単です。このアプリケーションを実行すると、以下のように続きます。
DEMO> exec my_procedure2
I am version 1.0
PL/SQL procedure successfully completed.
ここで、アプリケーションの実行中にストアド・プロシージャのバグが見つかったとします。従来は、新しいコードをインストールする際には、メンテナンスのために機能を停止する必要がありました。
しかし現在では、ユーザーがデフォルト・エディション(ORA$BASE)のコードを実行中に変更することができます。
DBAは、まずアカウントDEMOにエディションの使用を許可し、エディションVERSION2を参照したり使ったりできるようにする必要があります。
また、ここではSCOTTが私の書いたコードのテストをおこなう担当者だとします。SCOTTはアプリケーションの管理ではなく、テストをおこないます。そのためには、VERSION2が公開される前に確認する必要があります。そこで、アカウントSCOTTにVERSION2を参照、使用する権限を与えます。
SQL> alter user demo
2 enable editions;
User altered.
SQL> grant use
2 on edition version2
3 to demo;
Grant succeeded.
SQL> grant use
2 on edition version2
3 to scott;
Grant succeeded.
ALTER USER句で、アカウントDEMOがアプリケーションコードを使えるようにしました。そうしないと、アカウントDEMOはOracle Database 11g R1までと同様、既存のコードに対して1つのコピーしかもつことができません。
GRANT USE句は、アカウントDEMOやSCOTTに対し、エディションVERSION2を参照することを許可します。
アカウントDEMOはエディションを作成できるので、エディションVERSION2を修正することもできます。このエディションのさまざまなオブジェクトを、他のエディションに影響を与えることなく変更できるのです。
アカウントSCOTTは、エディションVERSION2を使うことができます。セッションの現行エディションをVERSION2にし、このエディションにあるオブジェクトを参照できます。
次に、アプリケーションにパッチを当てます。アカウントDEMOでログインし、以下のように、私のセッションがVERSION2エディションを使えるように変更してから、内容を確認します。
DEMO> alter session
2 set edition = version2;
Session altered.
DEMO> select object_name,
2 object_type,
3 status,
4 edition_name
5 from user_objects;
OBJECT_NAME OBJECT_TYPE STATUS EDITION_NAME
------------- ----------- ------ ------------
MY_PROCEDURE2 PROCEDURE VALID ORA$BASE
MY_PROCEDURE PROCEDURE VALID ORA$BASE
現在、エディションVERSION2には、2つのPL/SQLユニット(MY_PROCEDURE とMY_PROCEDURE2)があります。しかし、EDITION_NAME列を見ればわかるとおり、これらはORA$BASEから継承したものです。VERSION2はORA$BASEのコピーを指しているので、コードの物理的なコピーではありません。
次に、2つのバグを修正します。
まず、MY_PROCEDUREの実装にバグがあるため、このコードを置き換えます。
また、アプリケーションのデプロイ時にGRANTを実行し忘れたため、アカウントSCOTTにはMY_PROCEDURE2でのEXECUTE権限がありません。そこで、これも修正します。
最初に、コードをアップグレードします。
DEMO> create or replace
2 procedure my_procedure
3 as
4 begin
5 dbms_output.put_line
6 ( 'I am version 2.0' );
7 end;
8 /
Procedure created.
DEMO> select object_name,
2 edition_name
3 from user_objects;
OBJECT_NAME EDITION_NAME
------------- ------------
MY_PROCEDURE2 ORA$BASE
MY_PROCEDURE VERSION2
このように、2つのオブジェクトしかありませんが、実際は3つの物理的オブジェクトがあります。ORA$BASEから継承したMY_PROCEDURE2と、エディションVERSION2に物理的に存在するMY_PROCEDUREです。これを、コードの有効化と呼びます。エディションに物理的なコードのコピーがあると、私はそのエディションのコードを有効化します。
すべてのエディションを参照可能な新しいビューを使えば、すべてのDEMOスキーマの状態を確認できます。ビューUSER_OBJECTS_AEをOBJECT_NAMEとEDITION_NAMEに対して実行します。
DEMO> select object_name,
2 edition_name
3 from user_objects_AE;
OBJECT_NAME EDITION_NAME
------------- ------------
MY_PROCEDURE ORA$BASE
MY_PROCEDURE2 ORA$BASE
MY_PROCEDURE VERSION2
これらのエディションを見ると、私がMY_PROCEDUREの2つの物理コピーを有効化したことがわかるでしょう。1つ目はデフォルト・エディションORA$BASEで、もう1つは新しいエディションVERSION2です。
次に、アカウントSCOTTにEXECUTE権限を与えます。
DEMO> grant execute
2 on my_procedure2
3 to scott;
Grant succeeded.
DEMO> select object_name,
2 edition_name
3 from user_objects;
OBJECT_NAME EDITION_NAME
------------- ------------
MY_PROCEDURE2 VERSION2
MY_PROCEDURE VERSION2
DEMO> select object_name,
2 edition_name
3 from user_objects_AE;
OBJECT_NAME EDITION_NAME
------------- ------------
MY_PROCEDURE2 ORA$BASE
MY_PROCEDURE ORA$BASE
MY_PROCEDURE2 VERSION2
MY_PROCEDURE VERSION2
USER_OBJECTSを見ると、2つのプロシージャがあることがわかりますが、いずれもエディションVERSION2で有効化されています。MY_PROCEDURE2というストアド・プロシージャのEXECUTE権限をアカウントSCOTTに与えるために、このストアド・プロシージャの物理的なバージョンをエディションVERSION2に作ることになりました。
このエディションは、誰かがプロシージャを実行しているときに発生するブロックやロックなどの並列処理問題を引き起こすことなく、独立して権限を与えることができました。
USER_OBJECTS_AEを見ると、それぞれのエディションに2つずつ、合計4つの物理的オブジェクトがあることがわかります。
次に、ストアド・プロシージャMY_PROCEDURE2をエディションVERSION2で実行します。
DEMO> SELECT SYS_CONTEXT
2 ('userenv',
3 'current_edition_name') sc
4 FROM DUAL;
SC
----------------------
VERSION2
DEMO> exec my_procedure2
I am version 2.0
PL/SQL procedure successfully completed.
The version 2.0 code is executed.
CONNECT句を実行し、データベースのデフォルト・エディション(ここでもORA$BASE)を使うだけで、以下が実行されます。
DEMO> connect demo/demo
Connected.
DEMO> SELECT SYS_CONTEXT
2 ('userenv',
3 'current_edition_name') sc
4 FROM DUAL;
SC
-----------------------
ORA$BASE
DEMO> exec my_procedure2
I am version 1.0
PL/SQL procedure successfully completed.
バージョン1.0のコードはまだ存在し、デフォルトで実行されます。
加えて、アカウントSCOTTに与えたEXECUTE権限の効果を確かめるために、SCOTTで接続してストアド・プロシージャMY_PROCEDURE2をデフォルト・エディションとVERSION2で実行してみます。
DEMO> connect scott/tiger
Connected.
SCOTT> SELECT SYS_CONTEXT
2 ('userenv',
3 'current_edition_name') sc
4 FROM DUAL;
SC
-----------------------
ORA$BASE
SCOTT> exec demo.my_procedure2
BEGIN demo.my_procedure2; END;
*
ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00201: identifier 'DEMO.MY_PROCEDURE2' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
SCOTT> alter session
2 set edition = version2;
Session altered.
SCOTT> exec demo.my_procedure2
I am version 2.0
PL/SQL procedure successfully completed.
SCOTTがORA$BASEを使っているとき、SCOTTはストアド・プロシージャMY_PROCEDURE2を参照したり実行することはできません。しかし、エディションVERSION2では、SCOTTはこのプロシージャの参照や実行が可能です。したがって、バージョン2.0のアプリケーションが稼動すれば、SCOTTはデフォルトでこのプロシージャを実行できるようになります。
これで、アプリケーションコードを稼動させ、ユーザーコミュニティに広く使ってもらう準備ができました。DBAが発行する1つのシンプルなALTER DATABASE句が、データベースの現行エディションをVERSION2に変え、このコードをただちにアクセス可能にします。
ここで説明した内容は、エディション・ベースの再定義の豊富な機能のごく一部にすぎません。
PL/SQLユニットを置き換え、いくつかのオブジェクトの権限を変更するという、わりあい一般的な操作に関する説明にとどめています。
エディション・ベースの再定義は、さらに多くの可能性をもつ機能です。興味のある方は、ぜひ「Oracle Databaseアドバンスト・アプリケーション開発者ガイド11gリリース2 (11.2)」の19章をお読みください。
▲ ページTOPに戻る
Oracle Database 11g Release 2に関する10の重要なこと – askTom Live - 目次
Copyright © 2010, Oracle Corporation Japan. All rights reserved.
無断転載を禁ず
|
この文書はあくまでも参考資料であり、掲載されている情報は予告なしに変更されることがあります。日本オラクル社は本書の内容に関していかなる保証もいたしません。また、本書の内容に関連したいかなる損害についても責任を負いかねます。
Oracleは米国Oracle Corporationの登録商標です。文中に参照されている各製品名及びサービス名は米国Oracle Corporationの商標または登録商標です。その他の製品名及びサービス名はそれぞれの所有者の商標または登録商標の可能性があります。 |
Thomas(Tom) Kyte (トム・カイト)
2000年にAsk Tomブログ( http://asktom.oracle.com ) を開設して以来10年にわたり、全世界のオラクル技術者のありとあらゆる質問に答え、データベース技術の活用を世に広めてきた世界的に有名なエバンジェリスト。
|