2021年7月29日木曜日

Oracle REST Data ServicesでのSQLの実行

 以前にOracle APEXによるSQLの実行という題で、Oracle APEXではSQLがどのように実行されているか紹介しています。Oracle REST Data ServicesでのSQLの実行はAPEXとは異なり、Oracle Databaseのプロキシ接続を使っています

以下、確認作業のログになります。

最初にAutonomous Databaseで確認します。Always FreeのAutonomous Transaction ProcessingのインスタンスにユーザーAPEXDEVが作成されています。

データベース・アクションデータベース・ユーザーを開いて確認します。


RESTの有効化がされているのはユーザーADMINのみです。

ビューPROXY_USERSを確認します。

select * from proxy_users

PROXY            CLIENT             AUTHENTICATION FLAGS                               
---------------- ------------------ -------------- ----------------------------------- 
C##CLOUD$SERVICE ADMIN              NO             PROXY MAY ACTIVATE ALL CLIENT ROLES 
ORDS_PUBLIC_USER ADMIN              NO             PROXY MAY ACTIVATE ALL CLIENT ROLES 
OMLMOD$PROXY     OML$MODELS         NO             PROXY MAY ACTIVATE ALL CLIENT ROLES 
ORDS_PUBLIC_USER ORDS_PLSQL_GATEWAY NO             PROXY MAY ACTIVATE ALL CLIENT ROLES 
ADMIN            RMAN$VPC           NO             PROXY MAY ACTIVATE ALL CLIENT ROLES 

Autonomous Databaseでのプロキシ・ユーザーの初期状態です。

ユーザーAPEXDEVRESTの有効化を実行します。


ポップアップされるダイアログのREST対応ユーザーをクリックします。

再度ビューPROXY_USERSを確認します。ORDS_PUBLIC_USERをプロキシとして、ユーザーAPEXDEVにて接続できるようになっています。

PROXY            CLIENT             AUTHENTICATION FLAGS                               
---------------- ------------------ -------------- ----------------------------------- 
C##CLOUD$SERVICE ADMIN              NO             PROXY MAY ACTIVATE ALL CLIENT ROLES 
ORDS_PUBLIC_USER ADMIN              NO             PROXY MAY ACTIVATE ALL CLIENT ROLES 
OMLMOD$PROXY     OML$MODELS         NO             PROXY MAY ACTIVATE ALL CLIENT ROLES 
ORDS_PUBLIC_USER ORDS_PLSQL_GATEWAY NO             PROXY MAY ACTIVATE ALL CLIENT ROLES 
ADMIN            RMAN$VPC           NO             PROXY MAY ACTIVATE ALL CLIENT ROLES 
ORDS_PUBLIC_USER APEXDEV            NO             PROXY MAY ACTIVATE ALL CLIENT ROLES 

RESTの有効化はプロシージャORDS_ADMIN.ENABLE_SCHEMAを呼び出しています。この中で行われている処理のひとつとして、プロキシ接続の有効化が行われています。

簡単なRESTサービスを実装して、RESTサービスを実行しているセッションの情報を確認してみます。

データベース・アクションにユーザーAPEXDEVでサインインし、RESTを開きます。モジュールから作成します。

左上にあるモジュールの作成をクリックします。

モジュール名testベース・パス/test/として、モジュールを作成します。公開ONにします。モジュール名、ベース・パスはtestでなくてもかまいません。


モジュールが作成されたら、続いてテンプレートの作成を実行します。

URIテンプレートsessionとし、作成をクリックします。URIテンプレートについても、sessionでなければいけない、ということはありません。

テンプレートが作成されたら、ハンドラの作成を実行します。

ハンドラのソースとして、以下のSELECT文を指定します。

select
sys_context('userenv','session_user') as session_user,
sys_context('userenv','session_schema') as session_schema,
sys_context('userenv','current_schema') as current_schema,
sys_context('userenv','proxy_user') as proxy_user
from dual

メソッドGETソース・タイプには収集問合せを選択します。

以上でOracle REST Data Sources側の設定は完了です。実際に呼び出して結果を確認してみます。

RESTサービスを呼び出した結果です。

{"items": [{"session_user": "APEXDEV","session_schema": "APEXDEV","current_schema": "APEXDEV","proxy_user": "ORDS_PUBLIC_USER"}],"hasMore": false,"limit": 25,"offset": 0,"count": 1,}

proxy_userORDS_PUBLIC_USERになっていることが確認できます。

Autonomous Databaseでは、データベースの利用者はORDS_PUBLIC_USERを使ってデータベースには接続できません。プロキシ・ユーザーによる接続方法の参考として、オンプレミスの環境でsqlplusを使って接続してみます。

SQL> connect ords_public_user[apexdev]/******@localhost/xepdb1.world

Connected.

SQL> select 

sys_context('userenv','session_user') as session_user,

sys_context('userenv','session_schema') as session_schema,

sys_context('userenv','current_schema') as current_schema,

sys_context('userenv','proxy_user') as proxy_user

from dual  2    3    4    5    6  

  7  /


SESSION_USER SESSION_SCHEMA   CURRENT_SCHEMA   PROXY_USER

---------------- ---------------- ---------------- ----------------

APEXDEV  APEXDEV   APEXDEV   ORDS_PUBLIC_USER


SQL> 

ユーザーの指定のords_public_user[apexdev]/*****の部分がプロキシ接続の指定方法です。パスワードはユーザーORDS_PUBLIC_USERのものでAPEXDEVではありません。ユーザーAPEXDEVの代わりにORDS_PUBLIC_USERを使っているため、プロキシ(代理という意味)接続になります。

プロキシ接続を許可するコマンドは以下になります。

ALTER USER APEXDEV GRANT CONNECT THROUGH ORDS_PUBLIC_USER;

GRANTの代わりにREVOKEを使うと、プロキシ接続の許可が解除されます。

Oracle APEXとデータベースへの接続方法が異なるため、Oracle REST Data Servicesでは使用するコネクション・プールを分けています。APEX向けのコネクション・プールはapex.xml、Oracle REST Data ServicesのRESTサービス向けはapex_pu.xmlが、コネクション・プールの構成ファイルになります。

APEXでもORDSでも、アプリケーションを開発している時点で接続方法の違いを意識することは無いかと思います。どちらも指定したユーザー(今回の場合ではAPEXDEV)の権限でSQLは実行されます。とはいえ、頭の片隅にでも入れていただき、障害が発生したときなどに役立ていただけると幸いです。