2021年1月20日水曜日

解析対象スキーマの変更による影響の確認

 Oracle APEXのアプリケーションの設定である、解析対象スキーマを変更した場合、どのような影響があるかを確認しました。結論を先に記載すると、データベースの接続ユーザーが変わったのと同じ影響があります。

特に意識して設定をしなければ、ワークスペースを作成する際に、同名のデータベース・ユーザー( = スキーマ)を作成していると思います。

そして、そのワークスペースに作成したアプリケーションの解析対象スキーマは、上記のデータベース・ユーザーがデフォルトの設定になります。

一般的には、Oracle APEXのアプリケーションで扱うデータベース・オブジェクトは、このデータベース・ユーザー( = スキーマ)の持ち物として作成しているでしょう。

これから、解析対象スキーマと異なるスキーマにオブジェクトを作成し、そのオブジェクトを扱うアプリケーションを作成します。アプリケーションの作成後、解析対象スキーマを変更し、影響を確認します。

確認作業はAutonomous Databaseを使って実施します。

Oracle APEXのワークスペースおよびデータベース・ユーザーはAPEXDEVとして作成されていることを前提とします。


SQL Developer Webによるデータベース・ユーザーおよび表の作成


SQL Developer Webにアクセスし、左のメニューか、もしくは真ん中のパネルの管理に含まれるデータベース・ユーザーを実行します。


開いた画面から、ユーザーの作成を実行します。


最低限、ユーザー名パスワードパスワードの確認を設定します。その他の設定は、今回の検証に影響しません。設定した後、ユーザーの作成を実行します。


データベース・ユーザーが作成されました。


続いて、表EMPを作成します。SQLの実行画面を開いて、オブジェクトの作成を開きます。


スキーマとして先ほど作成したHR(選択リストに表示されない場合は、一旦ブラウザをリロードします)を選択し、名前EMPを指定します。一般タブから、列EMPNOENAMEを以下の属性で追加します。

名前: EMPNO, データ型: NUMBER, PKおよびID列をチェック
名前: ENAME, データ型: VARCHAR2(80)


制約のタブに移り、ENAMEのNOT NULLにチェックを入れます。


DDLを確認し、作成を行います。


表EMPが作成されたことを確認し、画面を閉じます


データベース・ユーザーAPEXDEVから検索のみを許可するよう、SQLの実行画面よりGRANT文を発行します。また、確認に使用するデータを表EMPに数行書き込んでおきます。SQLの実行が正常終了していることを、スクリプト出力から確認します。
grant select on hr.emp to apexdev;
alter user hr quota unlimited on data;
insert into hr.emp(ename) values('SCOTT');
insert into hr.emp(ename) values('ADAM');
insert into hr.emp(ename) values('SHARON');
commit;

以上でSQL Developer Webを使ったスキーマHRの準備は完了です。

Oracle APEX管理サービスによるワークスペースとスキーマの紐づけ


続いて、Oracle APEXの管理サービスにアクセスし、ワークスペースの管理を開きます。


ワークスペースとスキーマの割当ての管理を実行します。


スキーマの追加をクリックします。


スキーマとして既存を選択し、へ進みます。


新たに作成したスキーマを紐づけるワークスペースを選択します。今回の例ではAPEXDEVです。選択後、に進みます。


ワークスペースに紐づけるスキーマを選択します。今回の例ではHRです。選択後、に進みます。


設定内容を確認し、スキーマの追加を実行します。


ワークスペースにスキーマが紐づけられました。


以上で、Oracle APEXの管理サービスでの作業は完了です。

確認に使用するアプリケーションの作成


最初にアプリケーション・ビルダーから空のアプリケーションを作成しておきます。スクリーンショットと詳細手順は割愛します。

続いて、そのアプリケーションに、スキーマHRの表EMPを扱うレポートとフォームを作成します。

ページ作成ウィザードを実行します。


コンポーネントフォームをクリックします。


フォーム付きレポートをクリックします。


レポート・タイプとして対話モード・レポートレポート・ページ名フォーム・ページ名としてそれぞれ、従業員一覧従業員編集とします。フォーム・ページ・モードモーダル・ダイアログにします。に進みます。


ナビゲーションのプリファレンスとして、新規ナビゲーション・メニュー・エントリの作成を選択すると、新規ナビゲーション・メニュー・エントリはレポート・ページ名と同名の従業員一覧になります。そのままに進みます。


データ・ソースの指定にて、表/ビューの所有者としてHRを選択します。これはワークスペースにスキーマHRを紐づけたため選択可能になりました。表/ビューの名前EMP(表)を選択し、へ進みます。


フォームの主キー型として主キー列の選択を選択し、主キー列としてEMPNO (Number)を選択します。作成をクリックします。


以上で確認に使用するアプリケーションの作成が完了しました。

解析対象スキーマの影響確認


作成したアプリケーションを実行し、レポートを開きます。スキーマHRに存在する表EMPの内容がリストされていることが確認できます。これはデータベース・ユーザーAPEXDEVにSELECT権限を与えられているからです。(実際はSELECT権限がないとページ自体、ページ作成ウィザードで作成することができません)。

作成をクリックし、データの投入を試みます。ORA-1031が発生し、作成できません。同様に既存の行の変更や削除も同様にエラーとなります。


ページ・デザイナにてフォームの定義を確認します。表の所有者としてHRが設定されていることが確認できます。


アプリケーションの定義を開き、セキュリティの項目にある解析対象スキーマHRヘ変更し、変更の適用を実行します。


作成したアプリケーションから一旦サインアウトし、サインインし直してから、表EMPを操作してみます。今度は作成/変更の適用/削除、すべての操作が可能です。解析対象スキーマとして設定したHRの権限でアクセスされています。


ワークスペースをスキーマが紐づいていないと、表/ビューの所有者の選択対象とリストされないので、ソースの設定として宣言的にデータベース・オブジェクトを選ぶことができなくなります。つまり、以下のような定義ですむところを


以下のようにSQLで、手書きしなければなりません。


しかし、アプリケーションの解析対象スキーマも開発者によって変更できるようになるため、アプリケーションによっては権限設定を迂回することが可能になります。

解析対象スキーマはOracle APEXの標準ビューであるAPEX_APPLICATIONSOWNER列で参照できるので、不用意に解析対象スキーマが変更されているアプリケーションが無いことを確認することができます。

ワークスペース・ユーティリティApplication Expressビューを開きます。


ビューよりAPEX_APPLICATIONSを選んで開きます。


列にOWNERを含めて結果を表示させます。


OWNER(解析対象スキーマ)を確認することができます。


問合わせを開くと、確認に使用するSQLを参照することができます。

データベースが提供しているオブジェクトの保護機能の利用には、スキーマを分けるのが最初の作業になります。そのための基本的な操作方法と注意点の紹介でした。スキーマ設計の一助になれば幸いです。