2021年3月2日火曜日

エディションベース再定義をAPEXで使用する - エディショニング・ビュー編

エディション・ベースの再定義の記事の2番目になります。前回はプロシージャを扱いました。今回はエディションング・ビューを使ったOracle APEXアプリケーションを作ってみます。

環境は前回と同じAlways FreeのAutonomous Transaction Processingを使います。Oracle APEXのワークスペースとして、APEXDEVが作成されていることが前提です。

コマンドラインの操作も前回と同様にSQLclを使用します。

0. 行う作業の説明。

サンプル・データセットのEMP/DEPTをインストールして、それを元に最初のアプリケーションを作成します。

新規にエディションを作成し、表EMPに列WORK_LOCATIONを追加します。アプリケーションもWORK_LOCATIONを扱うように更新します。

1. サンプル・データセットをインストールし、アプリケーションの初版を作る。

SQLワークショップよりユーティリティに含まれるサンプル・データセットを開きます。


EMP/DEPTインストールします。


言語Japaneseを選択し、次に進みます。


データセットのインストールを実行します。


続けてアプリケーションの作成を実行します。


自動的に生成されるアプリケーションのままで、アプリケーションの作成を実行します。


アプリケーションが作成されました。実行して動作を確認してみましょう。


これが初版です。

2. 初版のアプリをエディショニング・ビューを使うように変更する。

ユーザーADMINで接続します。エディションed01を作成します。

SQL> create edition ed01;


Edition ED01は作成されました。


SQL>


作成したエディションed01が、APEXのワークスペース・スキーマAPEXDEVで使用できるようにします。

SQL> grant use on edition ed01 to apexdev;


Grantが正常に実行されました。


SQL>


ユーザーADMINを抜けて、ユーザーAPEXDEVで接続し直します。最初に表EMPおよびDEPTの名称を変更します。

SQL> alter table emp rename to emp_b;


Table EMPが変更されました。


SQL> alter table dept rename to dept_b;


Table DEPTが変更されました。


SQL>


行のインサート時に主キー列がNULLであると、値を設定するトリガーがそれぞれの表に設定されています。このトリガーがeditionable(つまり紐づいているエディションからのみ実行される)であるため、noneditionable(エディションによらず実行される)に変更します。

SQL> drop trigger emp_trg1;


Trigger EMP_TRG1が削除されました。


SQL> create or replace noneditionable TRIGGER emp_trg1

  2      before insert on "EMP_B"

  3      for each row

  4  begin

  5      if :new.empno is null then

  6          select emp_seq.nextval into :new.empno from sys.dual;

  7      end if;

  8  end;

  9  /


Trigger EMP_TRG1がコンパイルされました


SQL> drop trigger dept_trg1;


Trigger DEPT_TRG1が削除されました。


SQL> create or replace noneditionable TRIGGER dept_trg1

  2      before insert on "DEPT_B"

  3      for each row

  4  begin

  5      if :new.deptno is null then

  6          select dept_seq.nextval into :new.deptno from sys.dual;

  7      end if;

  8  end;

  9  /


Trigger DEPT_TRG1がコンパイルされました


SQL>


セッション・エディションをED01に設定し、表EMP_B、DEPT_Bのエディショニング・ビューをそれぞれ、EMP、DEPTとして作成します。

SQL> alter session set edition = ed01;


Sessionが変更されました。


SQL> create editioning view emp

  2  as 

  3  select * from emp_b;


View EMPは作成されました。


SQL> create editioning view dept

  2  as

  3  select * from dept_b;


View DEPTは作成されました。


SQL>


作成したエディショニング・ビューが機能しているか確認するため、ビューEMP_DEPT_Vを検索します。


SQL> select * from emp_dept_v;


   EMPNO     ENAME       JOB       MGR     HIREDATE     SAL    COMM    DEPTNO    DNAME    LOC 

________ _________ _________ _________ ____________ _______ _______ _________ ________ ______ 

    7839 中島 亜希子    社長                  17-NOV-81       5000                10 会計       東京     

    7782 坂本 明      マネージャー    中島 亜希子    09-JUN-81       2450                10 会計       東京     

    7934 石原 裕美     店員        坂本 明      23-JAN-82       1300                10 会計       東京     

    7566 関口 晃      マネージャー    中島 亜希子    02-APR-81       2975                20 研究開発     京都     

    7788 新井 敦子     アナリスト     関口 晃      09-DEC-82       3000                20 研究開発     京都     

    7902 石橋 敦      アナリスト     関口 晃      03-DEC-81       3000                20 研究開発     京都     

    7369 村田 淳      店員        石橋 敦      17-DEC-80        800                20 研究開発     京都     

    7876 増田 秀樹     店員        新井 敦子     12-JAN-83       1100                20 研究開発     京都     

    7698 伊藤 明子     マネージャー    中島 亜希子    01-MAY-81       2850                30 セールス     大阪     

    7499 村上 綾子     セールス      伊藤 明子     20-FEB-81       1600     300        30 セールス     大阪     

    7521 斉藤 大介     セールス      伊藤 明子     22-FEB-81       1250     500        30 セールス     大阪     

    7654 高橋 大輔     セールス      伊藤 明子     28-SEP-81       1250    1400        30 セールス     大阪     

    7844 金子 恵美     セールス      伊藤 明子     08-SEP-81       1500       0        30 セールス     大阪     

    7900 佐野 英樹     店員        伊藤 明子     03-DEC-81        950                30 セールス     大阪     


14行が選択されました。 


SQL> 


表EMP、DEPTをエディショニング・ビューに置き換えても、ビューEMP_DEPT_Vは使用できています。初版のアプリケーションをエディショニング・ビューを使うよう更新します。

共有コンポーネントセキュリティ属性を開きます。


データベース・セッションの初期化PL/SQLコードで、使用するエディションを設定します。
begin
    apex_util.set_edition('ED01');
end;
設定をしたのち、変更の適用をクリックします。


アプリケーションを実行し、動作を確認しましょう。


この状態で、初版のアプリケーションは表EMP_B、DEPT_Bへの変更の影響を受けなくなりました。

ただし、まったく影響を受けないわけではありません。例えば表の列のドロップが行われると影響は発生します。

列のドロップについては、一旦列をINVISBILEに変えて、ドロップ対象の列を参照しないようにアプリケーションを改変します。新しいアプリケーションに移行後、古いアプリケーションの削除と同時に列もドロップする、といった対応になります。この作業はエディションを使わなくても可能です。

3. 列WORK_LOCATIONを追加する。

ユーザーADMINで接続し、エディションed02を作成します。作成したエディションはスキーマAPEXDEVで利用可能にします。

SQL> create edition ed02 as child of ed01;


Edition ED02は作成されました。


SQL> grant use on edition ed02 to apexdev;


Grantが正常に実行されました。


SQL>


ユーザーAPEXDEVで接続し直します。基底の表である表EMP_Bに列WORK_LOCATIONを追加し、その列を含むエディショニング・ビューとしてEMPを再作成します。

SQL> alter session set edition = ed02;


Sessionが変更されました。


SQL> alter table emp_b add (work_location varchar2(80));


Table EMP_Bが変更されました。

SQL> create or replace editioning view emp

  2  as 

  3  select * from emp_b;


View EMPは作成されました。


SQL>


作成されたエディショニング・ビューを確認します。select * from empを実行すると、列WORK_LOATIONも表示されます。

SQL> select * from emp;


   EMPNO     ENAME       JOB     MGR     HIREDATE     SAL    COMM    DEPTNO    WORK_LOCATION 

________ _________ _________ _______ ____________ _______ _______ _________ ________________ 

    7839 中島 亜希子    社長                17-NOV-81       5000                10                  

    7698 伊藤 明子     マネージャー       7839 01-MAY-81       2850                30                  

    7782 坂本 明      マネージャー       7839 09-JUN-81       2450                10                  

    7566 関口 晃      マネージャー       7839 02-APR-81       2975                20                  

    7788 新井 敦子     アナリスト        7566 09-DEC-82       4000                20                  

    7902 石橋 敦      アナリスト        7566 03-DEC-81       3000                20                  

    7369 村田 淳      店員           7902 17-DEC-80        800                20                  

    7499 村上 綾子     セールス         7698 20-FEB-81       1610     300        30                  

    7521 斉藤 大介     セールス         7698 22-FEB-81       1250     500        30                  

    7654 高橋 大輔     セールス         7698 28-SEP-81       1250    1400        30                  

    7844 金子 恵美     セールス         7698 08-SEP-81       1500       0        30                  

    7876 増田 秀樹     店員           7788 12-JAN-83       1100                20                  

    7900 佐野 英樹     店員           7698 03-DEC-81        950                30                  

    7934 石原 裕美     店員           7782 23-JAN-82       1300                10                  


14行が選択されました。 


SQL>


一旦、セッション・エディションをed01へ戻し、select * from empを実行します。列WORK_LOCATIONが含まれないことが確認できます。

SQL> alter session set edition = ed01;


Sessionが変更されました。


SQL> select * from emp;


   EMPNO     ENAME       JOB     MGR     HIREDATE     SAL    COMM    DEPTNO 

________ _________ _________ _______ ____________ _______ _______ _________ 

    7839 中島 亜希子    社長                17-NOV-81       5000                10 

    7698 伊藤 明子     マネージャー       7839 01-MAY-81       2850                30 

    7782 坂本 明      マネージャー       7839 09-JUN-81       2450                10 

    7566 関口 晃      マネージャー       7839 02-APR-81       2975                20 

    7788 新井 敦子     アナリスト        7566 09-DEC-82       4000                20 

    7902 石橋 敦      アナリスト        7566 03-DEC-81       3000                20 

    7369 村田 淳      店員           7902 17-DEC-80        800                20 

    7499 村上 綾子     セールス         7698 20-FEB-81       1610     300        30 

    7521 斉藤 大介     セールス         7698 22-FEB-81       1250     500        30 

    7654 高橋 大輔     セールス         7698 28-SEP-81       1250    1400        30 

    7844 金子 恵美     セールス         7698 08-SEP-81       1500       0        30 

    7876 増田 秀樹     店員           7788 12-JAN-83       1100                20 

    7900 佐野 英樹     店員           7698 03-DEC-81        950                30 

    7934 石原 裕美     店員           7782 23-JAN-82       1300                10 


14行が選択されました。 


SQL> 


ビューUSER_EDITIONING_VIEWS_AEを検索すると、エディションED01、ED02それぞれにビューEMPが定義されていることが分かります。

SQL> select * from user_editioning_views_ae;


   VIEW_NAME    TABLE_NAME    EDITION_NAME 

____________ _____________ _______________ 

DEPT         DEPT_B        ED01            

EMP          EMP_B         ED01            

EMP          EMP_B         ED02            


SQL>



4. アプリケーションを更新する。

注意:アプリケーション別名が日本語の場合、コピーに失敗します。アプリケーション定義より、あらかじめアプリケーション別名を英語に変更しておきます。


列WORK_LOCATIONも扱うように、アプリケーションを更新します。アプリケーション・ビルダーで初版のアプリケーションを開き、このアプリケーションのコピーを実行します。


新規アプリケーション名として、末尾に第2版を加え、に進みます。


確認画面より、アプリケーションのコピーを実行します。


アプリケーションのコピーが完了したら、共有コンポーネントセキュリティ属性に設定したエディションをED01からED02へ変更します。データベース・セッション初期化PL/SQLコードの記述です。


アプリケーションを実行する前に、共有コンポーネントアプリケーション・アクセス制御を開きます。


アプリケーションのコピーの際にはユーザー・ロール割当てはコピーされないので、新たに追加します。


今回はユーザーAPEXDEV管理者のアプリケーション・ロールを追加しました。割当ての作成をクリックします。

ユーザー・ロール割当てが作成されました。


これでアプリケーションを実行し、ログインができるようになりました。

アプリケーションを実行し、従業員の画面を開きます。


クイック編集から、Employeesのクラシック・レポートを選択し、ページ・デザイナを開きます。


クラシック・レポートのリージョンEmployeesでコンテキスト・メニューを表示し、列の同期化を実行します。


エラーが発生します。エラー・メッセージを確認すると、表EMPが見つからないようです。


ページ・デザイナはデフォルト・エディション、つまりORA$BASEで動作しているため、EMPやDEPTのエディショニング・ビューを参照できません。考えられるワークアラウンドは2つあります。

  1. データベースのデフォルト・エディションをED02に変更する。
  2. エディションORA$BASEに開発のために使用するエディショニング・ビューを作成する。
全体に与える影響が少ない2番の方法を採用します。

ユーザーAPEXDEVで接続し、エディショニング・ビューEMPとDEPTを作成します。

SQL> alter session set edition = ora$base;


Sessionが変更されました。


SQL> create editioning view emp

  2  as 

  3  select * from emp_b;


View EMPは作成されました。


SQL> create editioning view dept

  2  as

  3  select * from dept_b;


View DEPTは作成されました。


SQL> 


再度、列の同期化を実行すると、今度は列WORK_LOCATIONが追加されます。


フォームのページを開き、フォームのリージョンにたいして、ページアイテムの同期化を実行します。


ページ・アイテムP4_WORK_LOCATIONが追加されたことを確認します。


アプリケーションを実行し、変更を確認します。従業員ページを開くと、列Work Locationが追加されていることが確認できます。


フォームを開いて、Work Locationを更新します。


変更の適用を行うと、レポートに更新されたWork Locationが表示されていることが確認できます。


以上で、列WORK_LOCATIONの追加に対応したアプリケーションの更新は完了しました。

5. 初版のアプリケーションを確認する。

初版のアプリケーションがきちんと動作するか、確認してみます。従業員のページに列Work Locationは含まれていません。


フォームを開いても、ページ・アイテムWORK_LOCATIONはありません。Salaryを変更して、変更の適用を実行します。


値の更新が行われたことを、レポートから確認できます。


初版のアプリケーションは、実行の際にはエディションED01を参照しますが、ページ・デザイナを開くとエディションはORA$BASEを参照します。アプリケーションを更新するためエディションORA$BASEには、エディションED02に存在するものと同じエディショニング・ビューをすでに作成しています。ですので、初版のアプリケーションを更新すべきではありません

更新されたアプリケーションへ利用者が完全に移行された後、アプリケーションを削除することができます。

エディショニング・ビューを使用したOracle APEXのアプリケーションの更新については以上です。次はcrosseditionトリガーに取り組もうと考えています。