制限された実行コンテキストについて
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-oracledbmle-js-plsql-ffimle-js-fetch
- グローバル・クラスおよび関数:
sessionsodaplsffioracledbrequire
mle-js-plsqltypesやmle-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; /
親トピック: JavaScriptのマルチリンガル・エンジンの概要