Autonomous DatabaseでのSODA for RESTの使用

Autonomous Databaseは、Simple Oracle Document Access (SODA) for RESTをサポートしています。

SODA for RESTの使用の概要

SODA for RESTは、JSONドキュメントをデータベースに格納するために使用できる事前にデプロイされたRESTサービスです。

SODAを使用すると、SQLを使用せずに、NoSQLスタイルの柔軟なアプリケーション開発が可能になります。SODAでは、JSONドキュメントは名前付きコレクションに格納され、単純なCRUD操作(作成、読取り、更新および削除)を使用して管理されます。また、SQLは必要ありませんが、SODAコレクションに格納されているJSONには、必要に応じてSQLから引き続き完全にアクセスできます。たとえば、操作アプリケーションは(SQLを使用せずに) SODAを使用して完全に構築できますが、後でアプリケーションの外部からSQLを使用してデータを分析できます。Autonomous Database SODAを使用すると、アプリケーション開発者は、分析およびレポート作成にSQLを利用する機能を失わずに、NoSQLおよびSQLの世界(高速かつ柔軟でスケーラブルなアプリケーション開発)のベストを使用できます。

SODA for RESTは、次のURLパターンでORDSにデプロイされます(schemaはREST対応のデータベース・スキーマに対応しています)。

/ords/schema/soda/latest/*

次の例では、cURLコマンドライン・ツール(http://curl.haxx.se/)を使用して、RESTリクエストをデータベースに送信します。ただし、他のサード・パーティのRESTクライアントおよびライブラリでも機能します。この例では、REST対応のデータベース・スキーマADMINを使用します。cURLコマンドを使用したSODA for RESTは、Oracle Cloud Shellから使用できます。

次のコマンドは、"fruit"という名前の新規コレクションをADMINスキーマに作成します:

> curl -X PUT -u 'ADMIN:<password>' \
"https://example-db.adb.us-phoenix-1.oraclecloudapps.com/ords/admin/soda/latest/fruit"

次のコマンドは、fruitコレクションに3つのJSONドキュメントを挿入します:

> curl -X POST -u 'ADMIN:<password>' \
 -H "Content-Type: application/json" --data '{"name":"orange", "count":42}' \
 "https://example-db.adb.us-phoenix-1.oraclecloudapps.com/ords/admin/soda/latest/fruit"

{"items":[{"id":"6F7E5C60197E4C8A83AC7D7654F2E375"...
 
> curl -X POST -u 'ADMIN:<password>' \
 -H "Content-Type: application/json" --data '{"name":"pear", "count":5}' \
 "https://example-db.adb.us-phoenix-1.oraclecloudapps.com/ords/admin/soda/latest/fruit"

{"items":[{"id":"83714B1E2BBA41F7BA4FA93B109E1E85"...
 
> curl -X POST -u 'ADMIN:<password>' \
 -H "Content-Type: application/json" \
 --data '{"name":"apple", "count":12, "color":"red"}' \
 "https://example-db.adb.us-phoenix-1.oraclecloudapps.com/ords/admin/soda/latest/fruit"

{"items":[{"id":"BAD7EFA9A2AB49359B8F5251F0B28549"...

次の例では、格納されたJSONドキュメントをコレクションから取得します:

> curl -X POST -u 'ADMIN:<password>' \
 -H "Content-Type: application/json" --data '{"name":"orange"}' \
 "https://example-db.adb.us-phoenix-1.oraclecloudapps.com/ords/admin/soda/latest/fruit?action=query"

{
  "items": [
    {
      "id":"6F7E5C60197E4C8A83AC7D7654F2E375",
      "etag":"57215643953D7C858A7CB28E14BB48549178BE307D1247860AFAB2A958400E16",
      "lastModified":"2019-07-12T19:00:28.199666Z",
      "created":"2019-07-12T19:00:28.199666Z",
      "value":{"name":"orange", "count":42}
    }
  ],
  "hasMore":false,
  "count":1
}

次のSQL問合せでfruitコレクションにアクセスします:

SELECT 
     f.json_document.name,
     f.json_document.count,
     f.json_document.color
FROM fruit f;

この問合せは、次の3行を返します:

name      count     color
--------- --------- -------
orange    42        null
pear      5         null
apple     12        red
ノート

Always Free Autonomous DatabaseでOracle Database 23aiを使用している場合、Oracleでは次のことをお薦めします:

Oracle Database 21cより前のデータベース・リリースを使用して開始されたプロジェクトの場合、「SODAドライバ」のセクションの例で指定されているように、デフォルト・コレクションのメタデータを明示的に指定します。Oracle Database 21c以降のリリースを使用して開始されたプロジェクトでは、デフォルト・メタデータのみを使用します。詳細は、SODAドライバを参照してください。

これらの例は、SODAおよびSQL/JSON機能の一部を示しています。詳細は、次を参照してください:

SODA for RESTを使用した購買オーダー・サンプル・データのロード

Oracleには、大量のJSON購買オーダー・ドキュメントがプレーンテキスト・ファイルPOList.jsonにオブジェクトのJSON配列として用意されており、そのような各オブジェクトはドキュメントを表します。

次の例では、cURLコマンドライン・ツール(http://curl.haxx.se/)を使用して、RESTリクエストをデータベースに送信します。ただし、他のサード・パーティのRESTクライアントおよびライブラリでも機能します。この例では、REST対応のデータベース・スキーマADMINを使用します。SODA for RESTを使用するには、Oracle Cloud ShellからcURLコマンドを実行します。

次のcurlコマンドを使用すると、SODA for RESTでAutonomous Database上のコレクションpurchaseorderにこのサンプル購買オーダー・データ・セットをロードできます:

curl -X GET "https://raw.githubusercontent.com/oracle/db-sample-schemas/master/order_entry/POList.json" -o POList.json

curl -X PUT -u 'ADMIN:password' \
"https://example-db.adb.us-phoenix-1.oraclecloudapps.com/ords/admin/soda/latest/purchaseorder"

curl -X POST -H -u 'ADMIN:password' 'Content-type: application/json' -d @POList.json \
"https://example-db.adb.us-phoenix-1.oraclecloudapps.com/ords/admin/soda/latest/purchaseorder?action=insert"

これにより、この購買オーダー・データを使用して、『Oracle Database JSON開発者ガイド』の例を試すことができます。

たとえば、次の問合せでは、JSON文書のidと値の両方を、表purchaseorderの列json_documentに格納されているJSON購買オーダーのコレクションから選択します。値は、仮想列としてドキュメントから投影されるJSON列json_documentのフィールドPONumberReferenceおよびRequestorから選択されます(詳細は、JSON_TABLEの代替のSQL NESTED句を参照してください)。

SELECT id, t.*
  FROM purchaseorder
    NESTED json_document COLUMNS(PONumber, Reference, Requestor) t;

詳細は、次を参照してください:

OAuthクライアント資格証明によるSODA for RESTの使用

Autonomous Database上のSODA for RESTにアクセスするには、OAuth認証を使用します。アプリケーションによっては、OAuth認証を使用してSODA for RESTにアクセスすると、パフォーマンスおよびセキュリティが向上することがあります。

OAuth認証を使用してAutonomous Database上のSODA for RESTへのアクセスを制限するには、次のステップを実行します:

  1. ADMINユーザーとしてデータベース・アクションにアクセスし、必要な権限を持つユーザーを作成します。
    1. ADMINとしてデータベース・アクションにアクセスします。
    2. 「データベース・アクション」で、ナビゲーション・アイコンをクリックして使用可能なアクションを表示します。
    3. 「データベース・アクション」の「管理」で、「データベース・ユーザー」を選択します。
    4. 「ユーザーの作成」をクリックします
    5. 「ユーザーの作成」領域の「ユーザー」タブで、ユーザー名パスワードを入力し、パスワードを確認します。
    6. 「Webアクセス」を選択します。
    7. 「ユーザーの作成」領域で、「付与されたロール」タブを選択し、ユーザーにDWROLEを付与します。
    8. 「ユーザーの作成」をクリックします
  2. データベース・アクションのSQLワークシートを使用して、データのロードに必要なユーザー権限を付与します。
    1. ADMINとしてデータベース・アクションにアクセスします。
    2. 「データベース・アクション」で、ナビゲーション・アイコンをクリックして使用可能なアクションを表示します。
    3. 「データベース・アクション」で、「開発」の下の「SQL」をクリックしてSQLワークシートを開きます。
    4. ステップ1のユーザーに、データのロードに必要なユーザー権限を付与します。
      GRANT UNLIMITED TABLESPACE TO user_name;
  3. ADMINユーザーとしてサインアウトします。
  4. OAuth認証を使用するように設定中のユーザーとしてデータベース・アクションにサインインします。
  5. データベース・アクションで、SQLワークシートを使用してOAuthクライアントを登録します。
    1. OAuthクライアントを登録します。
      たとえば、SQLワークシートに次のコマンドを入力して、ユーザーおよびクライアント・アプリケーションに適切な値を指定します。
      BEGIN
        OAUTH.create_client(
          p_name            => 'my_client',
          p_grant_type      => 'client_credentials',
          p_owner           => 'Example Company',
          p_description     => 'A client for my SODA REST resources',
          p_support_email   => 'user_name@example.com',
          p_privilege_names => 'my_priv'
        );
       
        OAUTH.grant_client_role(
          p_client_name => 'my_client',
          p_role_name   => 'SQL Developer'
        );
       
        OAUTH.grant_client_role(
          p_client_name => 'my_client',
          p_role_name   => 'SODA Developer'
        );
        COMMIT;
      END;
      /
    2. SQLワークシートで、「スクリプトの実行」をクリックしてコマンドを実行します。

    詳細は、OAUTH PL/SQLパッケージのリファレンスを参照してください。

    これは、OAuthクライアント資格証明を使用してmy_priv権限にアクセスする、my_clientという名前のクライアントを登録します。

  6. アクセス・トークンの生成に必要なclient_idおよびclient_secretを取得します。
    たとえば、SQLワークシートで次のコマンドを実行します:
    SELECT id, name, client_id, client_secret FROM user_ords_clients;
  7. アクセス・トークンを取得します。アクセス・トークンを取得するには、REST GETリクエストをdatabase_ORDS_urluser_name/oauth/tokenに送信します。

    database_ORDS_urlは、「関連サービス」「RESTfulサービスおよびSODA」カードで、「データベース・アクション」から使用できます。詳細は、RESTful ServicesおよびSODA for RESTへのアクセスを参照してください。

    次のコマンドでは、ステップ6で取得したclient_idおよびclient_secretを使用します。

    次の例では、cURLコマンドライン・ツール(http://curl.haxx.se/)を使用して、Autonomous DatabaseにRESTリクエストを送信します。ただし、他のサード・パーティのRESTクライアントおよびライブラリでも機能します。

    cURLコマンドライン・ツールを使用して、REST GETリクエストを送信できます。たとえば:

    > curl -i -k --user SBA-iO9Xe12cdZHYfryBGQ..:vvUQ1AagTqAqdA2oN7afSg.. --data "grant_type=client_credentials"https://mqssyowmqvgac1y-doc.adb.region.oraclecloudapps.com/ords/user_name/oauth/token
    HTTP/1.1 200 OK
    Date: Mon, 22 Jun 2020 15:17:11 GMT
    Content-Type: application/jsonTransfer-Encoding: chunked
    Connection: keep-alive
    X-Frame-Options: SAMEORIGIN  
    
    {"access_token":"JbOKtAuDgEh2DXx0QhvPGg","token_type":"bearer","expires_in":3600}

    client_idclient_secretをcurl --user引数で指定するには、コロンを入力してclient_idclient_secretを区切ります。ユーザー名client_idのみを指定した場合、curlによってパスワードの入力が求められ、プロンプトでclient_secretを入力できます。

  8. アクセス・トークンを使用して、保護されたリソースにアクセスします。

    前のステップで取得したトークンがAuthenticationヘッダーに渡されます。たとえば:

    > curl -i -H "Authorization: Bearer JbOKtAuDgEh2DXx0QhvPGg" -X GET https://database_id.adb.region.oraclecloudapps.com/ords/user_name/soda/latest
    HTTP/1.1 200 OK
    Date: Mon, 22 Jun 2020 15:20:58 GMT
    Content-Type: application/json
    Content-Length: 28
    Connection: keep-alive
    X-Frame-Options: SAMEORIGIN
    Cache-Control: private,must-revalidate,max-age=0
    
    
    {"items":[],"hasMore":false}

RESTfulサービスへのセキュアなアクセスの詳細は、RESTfulサービスへのセキュアなアクセスの構成に関する項を参照してください。