制限された実行コンテキストについて

PUREキーワードは、MLE環境およびJavaScriptインライン・コール仕様で指定して、制限されたJavaScript実行コンテキストを作成できます。

データベース内のJavaScriptコードでは、MLE JavaScript SQLドライバやSODAなどのAPIを使用して、SQL実行などのデータベース機能を利用できます。PUREでの実行では、JavaScript内のステートフル・データベースAPIへのアクセスは許可されません。つまり、完全に権限がない状態で実行されます。PURE環境では、JavaScriptコードは、表、プロシージャ、オブジェクトなどのデータベース状態を読取りまたは書込みできません。

PUREでの実行中にデータベースとやり取りできるのは、JavaScriptコードへの入力と出力を介してのみです。これは、コール仕様のユーザー定義関数の引数を介してデータベースからMLEに提供されるデータの形式、およびDBMS_MLE.EXPORT_TO_MLEを使用してエクスポートされた記号の形式です。MLEに渡されるLOBなどの参照タイプは、PUREでの実行中にアクセス(読取りまたは書込み)できます。また、PUREでの実行では、サポートされているデータ型へのアクセスは制限されません。

多くの場合、JavaScriptユーザー定義関数は純粋に計算であり、MLE JavaScript SQLドライバや外部関数インタフェース(FFI)などの強力なAPIにアクセスする必要はありません。PUREでの実行は、サード・パーティのJavaScriptライブラリなどの特定のコードをデータベース自体から分離する方法として機能します。この分離により、データベース状態へのアクセスがセキュリティ上の問題となる、サプライ・チェーン攻撃の攻撃対象領域が減少します。また、PUREでの実行を使用すると、権限の低い開発者は、データベース状態またはネットワークへの追加のアクセスまたは権限を必要とせずに、これらの制限されたユーザー定義関数を作成できます。

次のJavaScript API、グローバル・クラスおよび関数は、PUREでの実行中は使用できません:

  • JavaScript API:
    • mle-js-oracledb
    • mle-js-plsql-ffi
    • mle-js-fetch
  • グローバル・クラスおよび関数:
    • session
    • soda
    • plsffi
    • oracledb
    • require

mle-js-plsqltypesmle-js-encodingsなどのデータベース状態をやり取りしないJavaScript APIには、PUREでの実行中も引き続きアクセスできます。

PUREキーワードは、インライン・コール仕様、モジュール・コール仕様、およびDBMS_MLEを使用して指定できます。各ケースの構文の例を次に示します:

  • モジュール・コール仕様:

    CREATE OR REPLACE MLE MODULE pure_mod
    LANGUAGE JAVASCRIPT AS
    export function helloWorld() {
        console.log('Hello World, this is a JS module');
    }
    /
    
    CREATE OR REPLACE MLE ENV pure_env
    IMPORTS( 'pure_mod' MODULE pure_mod) PURE;
    
    CREATE OR REPLACE PROCEDURE helloWorld
    AS MLE MODULE pure_mod ENV pure_env SIGNATURE 'helloWorld';
    /
  • インライン・コール仕様:

    CREATE OR REPLACE PROCEDURE helloWorld 
    AS MLE LANGUAGE JAVASCRIPT PURE
    {{
        console.log('Hello World, this is a JS inlined call specification');
    }};
    /
  • DBMS_MLEの使用:

    SET SERVEROUTPUT ON;
    DECLARE
        l_ctx     dbms_mle.context_handle_t; 
        l_snippet CLOB; 
    BEGIN
        -- to specify PURE execution with DBMS_MLE, use an environment 
        -- that has been created with the PURE keyword
        l_ctx := dbms_mle.create_context(environment => 'PURE_ENV'); 
        l_snippet := q'~
            console.log('Hello World, this is dynamic MLE execution');
        ~'; 
        dbms_mle.eval(l_ctx, 'JAVASCRIPT', l_snippet); 
        dbms_mle.drop_context(l_ctx); 
    EXCEPTION 
        WHEN OTHERS THEN 
            dbms_mle.drop_context(l_ctx); 
            RAISE; 
    END; 
    /