ORDS (Oracle REST Data Services) の Database Actions を使えるようにしてみる (ORDS 23.1)

Oracle Database 23c の JSON Relational Duality とはなんぞや？ってことになり、体験するには、下記の記事が素晴らしい内容でした。ありがとうございます!

https://qiita.com/takuya_0301/items/d56628e22cdba8b222ed

ただ、これを体験するために Oracle Rest Data Service (ORDS) なるものをインストールするのですが、ついでに、ORDS をもう少し遊べるように、ORDS のインストール部分にフォーカスした内容を書いてみました。

ORDS を CDB へインストールすることで、PDB Lifecycle Management (REST API で PDB の作成や操作が可能になる)機能なども利用できるようになるのですが、少し複雑になるため本記事では触れません。また、ORDS は、APEX と組み合わせて利用されたり、MongoDB API を提供してくれたりします。

色々と機能を持っており、Oracle Database 23c Free + APEX + ORDS の組み合わせで、また違う世界に触れることができるようになるので、チャレンジをお勧めしたいところではあります(若干、挫折中...)

https://docs.oracle.com/en/database/oracle/oracle-rest-data-services/23.1/index.html

https://docs.oracle.com/en/database/oracle/sql-developer-web/

と言うわけで、JSON Relational Duality の記事で勉強する過程で、ちょっと強めの権限を付与したユーザで Databas Actions も利用できるようにしておくと、色々と新しい発見があったり便利になるかと思います。

## 前提条件

前提は、OCI 上の Oracle Linux 8 が稼働する compute instance となりますが、それ以外でも構いません。とにかく、Oracle Database 23c Free が動作しており、port 1521, 8080 にアクセスできる環境であれば良いです。
本記事では、ORDS を 23c Free が動作する環境にインストールする内容となっていますが、ORDS 自体は、shell script と WAR (Web Archive Resources) ファイルなので、Java 11 以降を動かせる OS であれば、外部に出して稼働させることも可能ですので、ORDS と 23c Free を別々の環境で動作させることもできます。(macOS では、colima で docker image を動作させつつ、macOS 側で ORDS を稼働させるなどしています)

- Database 23c Free のインストールが完了済みかつ起動していること
- port 1521, 8080 への接続を許可していること
- public IP を確認しておくこと
- パスワードは、welcome1 を前提としています。(異なる場合は、読み替えて実行してください)

Oracle Linux 8 へのインストールは、下記の記事が参考になります。ありがとうございます: 

https://qiita.com/500InternalServerError/items/45b4dd0cfc04fb1bab5e

## ORDS のインストール

Database 23c Free のインストールが完了したら、ORDS を PDB (freepdb1) にインストールします。
※この手順は、検証目的となり standalone mode を前提としています。

compute instance にて、下記を実行していきます：

### 1. ORDS のインストール

compute instance で、下記を実行:

```bash
$ sudo su -
# dnf -y install ords
# dnf install jdk-17.x86_64
```

### 2. 続いて、PDB: freepdb1 へ ORDS をインストール
```
# ords --config /etc/ords/config install
```

🐱 マークが、入力を促される部分となります: 
```
# ords --config /etc/ords/config install

    ORDS: Release 23.1 Production on Fri Apr 21 14:04:50 2023

    Copyright (c) 2010, 2023, Oracle.

    Configuration:
    /etc/ords/config/

    The configuration folder /etc/ords/config does not contain any configuration files.

    Oracle REST Data Services - Interactive Install

    Enter a number to select the type of installation
        [1] Install or upgrade ORDS in the database only
        [2] Create or update a database pool and install/upgrade ORDS in the database
        [3] Create or update a database pool only
🐱    Choose [2]: エンター

    Enter a number to select the database connection type to use
        [1] Basic (host name, port, service name)
        [2] TNS (TNS alias, TNS directory)
        [3] Custom database URL
🐱  Choose [1]: エンター

🐱  Enter the database host name [localhost]: エンター
🐱  Enter the database listen port [1521]: エンター
🐱  Enter the database service name [orcl]: freepdb1 (※PDB のサービス名)
    Provide database user name with administrator privileges.
🐱      Enter the administrator username: sys (SYSDBA 権限を利用します)
🐱  Enter the database password for SYS AS SYSDBA: パスワード (※welcome1)
    Connecting to database user: SYS AS SYSDBA url: jdbc:oracle:thin:@//localhost:1521/freepdb1

    Retrieving information.
    Enter the default tablespace for ORDS_METADATA and ORDS_PUBLIC_USER [SYSAUX]: エンター
    Enter the temporary tablespace for ORDS_METADATA and ORDS_PUBLIC_USER [TEMP]: エンター
    Enter a number to select additional feature(s) to enable:
        [1] Database Actions  (Enables all features)
        [2] REST Enabled SQL and Database API
        [3] REST Enabled SQL
        [4] Database API
        [5] None
🐱  Choose [1]: エンター

    Enter a number to configure and start ORDS in standalone mode
        [1] Configure and start ORDS in standalone mode
        [2] Skip

🐱  Choose [1]: エンター
    Enter a number to select the protocol
        [1] HTTP
        [2] HTTPS
🐱  Choose [1]: エンター
🐱  Enter the HTTP port [8080]: エンター
    The setting named: db.connectionType was set to: basic in configuration: default
    The setting named: db.hostname was set to: localhost in configuration: default
    The setting named: db.port was set to: 1521 in configuration: default
    The setting named: db.servicename was set to: freepdb1 in configuration: default
    The setting named: db.username was set to: ORDS_PUBLIC_USER in configuration: default
    The setting named: db.password was set to: ****** in configuration: default
    The setting named: feature.sdw was set to: true in configuration: default
    The global setting named: database.api.enabled was set to: true
    The setting named: restEnabledSql.active was set to: true in configuration: default
    The setting named: security.requestValidationFunction was set to: ords_util.authorize_plsql_gateway in configuration: default
    The global setting named: standalone.http.port was set to: 8080
    The global setting named: standalone.context.path was set to: /ords
    The global setting named: standalone.doc.root was set to: /etc/ords/config/global/doc_root
    2023-04-21T14:05:46.508Z INFO        Installing Oracle REST Data Services version 23.1.0.r0861423 in FREEPDB1
    ------------------------------------------------------------
    Date       : 21 Apr 2023 14:05:46
    Release    : Oracle REST Data Services 23.1.0.r0861423
    Type       : ORDS Install
    Database   : Oracle Database 23c Free,  
    DB Version : 23.2.0.0.0
    ------------------------------------------------------------
    Container Name: FREEPDB1
    Executing scripts for core
    ------------------------------------------------------------

    :
    :
    2023-04-21T14:06:08.276Z INFO        Oracle REST Data Services initialized
    Oracle REST Data Services version : 23.1.0.r0861423
    Oracle REST Data Services server info: jetty/10.0.12
    Oracle REST Data Services java info: Java HotSpot(TM) 64-Bit Server VM 17.0.5+9-LTS-191
```

ORDS は、このまま起動している状態となります。ここで、一度、Ctrl+C で終了させます


### 3. ORDS を起動

ORDS を background で起動しておきます: 

```bash
# /etc/init.d/ords start
INFO: Starting Oracle REST Data Services...

INFO: Oracle REST Data Services started with PID 122545
INFO: Obtaining the port binding information...
INFO: Oracle REST Data Services is bounded to ports 8080
```

ブラウザから、 `http://<public_IP>:8080/ords/sql-developer` にアクセスすると、なんかそれっぽいものが出てくるかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65800/89987ac7-bd27-9701-9a8b-0cf4e4767a02.png)

これが、Database Actions (SQL Developer Web と呼ばれていたもの)への入り口となります。
が、このままでは誰もログインできないので、次のステップでは、ORDS を利用できるユーザを設定したり作成したりして行きます。


## pdbadmin に権限を付与して Database Actions を利用可能にする

ORDS のインストールが完了したら、Database Actions へログイン可能なユーザを作成します。
新規ユーザを作成することもできますが、本記事では、pdbadmin ユーザを利用することにします。
※ 本記事は、検証を目的としているため、pdbadmin を利用しています。実際の運用ではセキュリティを考慮する必要がありますので、ご注意ください

* pdbadmin に権限を付与し、ORDS の Database Actions を利用できるようにする

### 1. SYSDBA で pdb へ接続: 

```bash
# sudo su - oracle
$ sqlplus sys/welcome1@localhost:1521/freepdb1 as sysdba
```

### 2. pdbadmin へ権限を付与するため、下記の sql を実行:
 
```sql
GRANT DBA TO pdbadmin CONTAINER=CURRENT;
GRANT inherit privileges on user pdbadmin to ORDS_METADATA;
```

### 3. pdbadmin に切り替えて接続し、REST enabled にするための SQL を実行:

```bash
$ sqlplus pdbadmin/welcome1@localhost:1521/freepdb1
```

pdbadmin を REST enabled にするために投入する PL/SQL:
```sql
BEGIN

    ORDS.ENABLE_SCHEMA(p_enabled => TRUE,
                       p_schema => 'pdbadmin',
                       p_url_mapping_type => 'BASE_PATH',
                       p_url_mapping_pattern => 'pdbadmin',
                       p_auto_rest_auth => FALSE);

    commit;

END;
/
```

### 5. ブラウザから、Database Actions へ接続

  ブラウザから、 `http://<public_IP>:8080/ords/sql-developer` にアクセスします。

### 6. pdbadmin ユーザでログインします

```
Username: pdbadmin
Password: welcome1
```

ここまでが、ORDS の基本的なインストール手順となります。
pdbadmin で利用できる Database Actions では、ユーザ作成や権限割り当て、REST 有効化などのアクションが可能な `DATABSE USERS` が利用できるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65800/26e264a1-6316-6921-b5fa-b4dfe1a47818.png)



## JSON Relational Duality を触ってみるユーザを作成

そろそろ下記の記事に合流したいので、記事にあわせ `JRD` と言う名前のユーザを作成します: 

https://qiita.com/takuya_0301/items/d56628e22cdba8b222ed

### 1. SYSDBA で PDB: freepdb1 へ接続

```sql
sqlplus sys/welcome1@localhost:1521/freepdb1 as sysdba
```

### 2. JRD ユーザの作成

ユーザを作成するために、下記の SQL を実行:

```sql
-- USER SQL
CREATE USER JRD IDENTIFIED BY welcome1;

-- ADD ROLES
GRANT CONNECT TO JRD;
GRANT CTXAPP TO JRD;
GRANT RESOURCE TO JRD;
ALTER USER JRD DEFAULT ROLE CONNECT,CTXAPP,RESOURCE;

-- QUOTA
ALTER USER JRD QUOTA UNLIMITED ON USERS;
```

### 3. 作成した `JRD` ユーザでの接続確認と Role の確認をします: 

```bash
$ sqlplus jrd/welcome1@localhost:1521/freepdb1

SQL> select role from session_roles; 

ROLE
--------------------------------------------------------------------------------
CONNECT
RESOURCE
SODA_APP
CTXAPP
```

4. 続けて、下記の PL/SQL を実行し、JRD ユーザを REST enabled にします:

```sql
-- ENABLE REST
BEGIN
    ORDS.ENABLE_SCHEMA(
        p_enabled => TRUE,
        p_schema => 'JRD',
        p_url_mapping_type => 'BASE_PATH',
        p_url_mapping_pattern => 'jrd',
        p_auto_rest_auth=> TRUE
    );
    commit;
END;
/
```

sqlplus でやっていますが、Database Actions に pdbadmin で　login し、`DATABASE USERS` メニューから実行することも可能です。

### 5. ブラウザから、Database Actions へ接続

  ブラウザから、 `http://<public_IP>:8080/ords/sql-developer` にアクセスします。

### 6. JRD ユーザでログインします

```
    Username: JRD
    Password: welcome1
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65800/6756e173-e528-e7a8-6af2-11753bd468d7.png)

以上で、Database Actions が利用できる環境を整えました。
Database Actions の SQL (monaco を利用した code editor) で、SQL を投入してみたり、JSON Relational Duality View の作成後に、`REST` メニューをみてみたりすると Auto Rest 項目が増えていたりと、少しだけ学習が楽しくなるかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65800/f718647e-01ea-d370-e805-d8b26fc22494.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65800/fb74375d-1fbd-690c-4f14-a5f150131ef0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65800/e59ea6aa-6a60-9821-dda0-e5950fe0ac93.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65800/f8108568-0e01-c0f7-e446-e90e6ce47743.png)


ORDS は、Oracle Database に興味深い機能を追加してくれるソフトウェアとなり、Cloud サービスではなく、単体のソフトウェアとして実装されているものとなるほか、対応する Database も 11g R2 以降 (Database のバージョンにより利用できる機能が異なる）で利用可能です。
ORDS 23.1 の Database Actions には、MLE JS (Oracle Database Multilingual Engine) が追加されており、GraalVM を用意することで、Oracle Database 上で JavaScript の実行もできようです。

参考までに、ORDS の構成などに関する推奨項目などは、下記に掲載されています: 

https://www.oracle.com/database/technologies/appdev/rest/best-practices/