デバッグポイントの管理
デバッグは、デバッグ仕様を指定してプロシージャdbms_mle.enable_debugging
をコールすることで、セッション内で有効にできます。
デバッグ仕様には、debugpoints
フィールドで指定したデバッグポイントの配列に加えて、version
フィールドで指定したバージョン識別子も含まれます。version
フィールドは、値"1.0"
に設定する必要があります。デバッグ仕様には、複数のMLEモジュールのデバッグポイントを含めることができます。
ノート:
デバッグ仕様では、モジュール名は、ディクショナリに格納されているものと同じ大/小文字で指定する必要があります。デフォルトでは、モジュールの作成時に名前が二重引用符で囲まれていないかぎり、モジュール名は大文字で格納されます。
プロシージャdbms_mle.enable_debugging
は、デバッグ出力が書き込まれるBLOB sink
も受け入れます。
dbms_mle.enable_debugging
のコール後、デバッグ仕様に含まれるすべてのデバッグポイントがアクティブになります。いずれかのデバッグポイントがヒットするたびに、関連するデバッグ情報が記録されます。デバッグ情報は、制御がMLEからPL/SQLに最後に戻ったときにBLOB sink
に書き込まれますが、この時点より前に一部または全部を書き込むことができます:
-
動的MLE評価の場合、
dbms_mle.eval
へのコールが戻されたときに、MLEからPL/SQLに制御が渡されます。 -
MLEコール仕様の場合、MLEコール仕様へのコールが戻されたときに、MLEからPL/SQLに制御が渡されます。
設定されたデバッグポイントは、MLEコードを実行するユーザーの権限に関係なく、MLEモジュールのすべての実行でアクティブになります。
同じセッションで再度dbms_mle.enable_debugging
をコールすると、既存のデバッグポイントのセットが置き換えられます。デバッグポイントは、セッションが終了するまでまたはユーザーがdbms_mle.disable_debugging
をコールして明示的にデバッグを無効にするまで、アクティブのままになります。
例9-5 MLEモジュールのデバッグの有効化
この例のデバッグ仕様では、例6-4の最初に作成されたモジュールcount_module
および例6-6で作成されたモジュールin_out_example_mod
を参照します。
DECLARE
debugspec json;
sink blob;
BEGIN
debugspec:= json('
{
"version": "1.0",
"debugpoints": [
{
"at": {
"name": "COUNT_MODULE",
"line": 7
},
"actions": [
{ "type": "watch", "id": "myCounter", "depth": 1 }
],
"condition": "myCounter > 0"
},
{
"at": {
"name": "IN_OUT_EXAMPLE_MOD",
"line": 16
},
"actions": [
{ "type": "snapshot" }
],
}
]
}
');
dbms_lob.createtemporary(sink, false);
dbms_mle.enable_debugging(debugspec, sink);
--run application to debug
END;
/
- デバッグのセキュリティに関する考慮事項
ユーザーは、デバッグ対象のMLEモジュールを所有しているかデバッグ権限を持っている必要があります。デバッグ機能によってMLEコードのランタイム状態を監視できるようになるため、こうしたことが必要です。 - MLEモジュールのCOLLECT DEBUG INFO権限
MLEモジュールのCOLLECT DEBUG INFO
オブジェクト権限は、モジュールを所有していないがEXECUTE
権限を持つユーザーが、そのモジュールでデバッグを実行できるかどうかを制御します。
親トピック: MLE JavaScriptモジュールの実行後のデバッグ
デバッグのセキュリティに関する考慮事項
ユーザーは、デバッグ対象のMLEモジュールを所有しているかデバッグ権限を持っている必要があります。デバッグ機能によってMLEコードのランタイム状態を監視できるようになるため、こうしたことが必要です。
condition
フィールドを使用すると任意のコードを実行できるため、デバッグするコードの実行時の動作を変更するためにこれを使用できる可能性があります。具体的には、次の場合に、MLEモジュールに対して実行後のデバッグを使用できます。
-
MLEモジュールを所有している、または
-
MLEモジュールに対する
COLLECT DEBUG INFO
オブジェクト権限がある。
1つ以上のアクティブなデバッグポイントを含むMLEモジュールのコードが実行されるたびに、権限がチェックされます。必要な権限がない状態でデバッグポイントを設定しようとすると、ORA-04164
エラーが発生します。
ORA-04164
が検出された場合、次のいずれかを実行します
-
デバッグポイントを設定したユーザーに、対象のモジュールに対する
COLLECT DEBUG INFO
権限を付与する必要があるか、または -
そのセッションでモジュール内のコードの実行を続行するには、モジュールのデバッグポイントを無効にする必要があります。
親トピック: デバッグポイントの管理
MLEモジュールのCOLLECT DEBUG INFO権限
MLEモジュールのCOLLECT DEBUG INFO
オブジェクト権限は、モジュールを所有していないがEXECUTE
権限を持つユーザーが、そのモジュールでデバッグを実行できるかどうかを制御します。
たとえば、ユーザーW
が所有するMLEモジュールModuleA
について考えてみます。ユーザーW
は、ModuleA
のファンクションに対する実行者権限のコール仕様を作成し、ユーザーV
に対してこのコール仕様のEXECUTE
を付与します。ユーザーV
がこのコール仕様をコールしたときにModuleA
のコードをデバッグできるようにするには、ユーザーW
がModuleA
に対するCOLLECT DEBUG INFO
権限も付与する必要があります。
ユーザーW
は、次の文を使用して、V
にModuleA
をデバッグする権限を付与できます:
GRANT COLLECT DEBUG INFO ON ModuleA TO V;
COLLECT DEBUG INFO
権限は、必要に応じて後で取り消すことができます:
REVOKE COLLECT DEBUG INFO ON ModuleA FROM V;
親トピック: デバッグポイントの管理