13.6.1 外部プロシージャのデフォルト構成

外部プロシージャは、別のプログラムからコールされる、異なる言語で記述されたプロシージャです。例としては、特別な目的の処理を実行するために必要な1つ以上のCルーチンを呼び出すPL/SQLプログラムがあります。

アプリケーションが外部プロシージャをコールすると、Oracle Databaseはextprocという名前の外部プロシージャ・エージェントを開始します。Oracle Databaseによって確立されたネットワーク接続を使用して、アプリケーションがエージェントに次の情報を渡します。

  • DLLまたは共有ライブラリの名前
  • 外部プロシージャ名
  • 任意のパラメータ

次に、エージェントはDLLや共有ライブラリをロードして外部プロシージャを実行し、外部プロシージャから戻された値をアプリケーションに戻します。エージェントは、外部プロシージャをコールするアプリケーションと同じコンピュータに常駐している必要があります。

外部プロシージャのデフォルト構成を使用する場合、extprocエージェントはOracle Databaseによって直接生成されます。listener.oraファイル、tnsnames.oraファイルのいずれも構成の変更は必要ありません。ただし、それらの環境変数を、ORACLE_BASE_HOME/hs/adminディレクトリにあるextproc.oraファイル内の外部プロシージャによって使用されるように定義する必要があります。外部プロシージャのデフォルトの構成を使用しない場合は、表13-6に示すパラメータを設定する必要があります。

表13-6 listener.oraファイルの外部プロシージャ設定

Oracle Enterprise Manager Cloud Controlのフィールド listener.oraのパラメータ 説明

プログラム名

PROGRAM

実行可能な外部プロシージャ・エージェントの名前。

ノート: Microsoft Windowsの場合、実行可能ファイルが、ORACLE_HOME\binディレクトリに存在している必要があります。

環境変数

ENVS

ORACLE_BASE_HOME/hs/adminディレクトリにあるextproc.oraファイル内の外部プロシージャによって使用される環境変数。

ノート: extproc.oraが使用されている場合、listener.oraの同じ環境変数ENVSより優先されます。

構文: SET name=value

例: SET EXTPROC_DLLS=ANY

EXTPROC_DLLS環境変数を指定して、extprocエージェントがロードできるDLLを制限します。EXTPROC_DLLS環境変数の指定がない場合、extprocエージェントは、UNIXオペレーティング・システムの場合はORACLE_HOME/libディレクトリから、Microsoft Windowsの場合はORACLE_HOME\binディレクトリからDLLをロードします。

EXTPROC_DLLSを次のいずれかの値に設定します。

  • DLLのコロン区切りリスト脚注1

    構文: "DLL:DLL"

    この値に設定すると、extprocエージェントは指定されたDLLをロードしたり、またはUNIXオペレーティング・システムの場合はORACLE_HOME/libディレクトリから、Microsoft Windowsの場合はORACLE_HOME\binディレクトリからDLLをロードできます。DLLの完全なディレクトリ・パスとファイル名を入力する必要があります。

  • ONLY (セキュリティを最大にする場合に推奨)脚注1

    構文: "ONLY:DLL:DLL"

    この値に設定すると、extprocエージェントは指定されたDLLのみロードできます。DLLの完全なディレクトリ・パスとファイル名を入力する必要があります。

  • ANY

    構文: "ANY"

    説明: この値に設定すると、extprocエージェントは任意のDLLをロードできます。ANYに設定すると、DLLチェックは無効になります。

例:

"EXTPROC_DLLS=/home/xyz/mylib.so:/home/abc/urlib.so,
LD_LIBRARY_PATH=/private/xpm/lib:/private/mylibs, 
MYPATH=/usr/ucb:/usr/local/packages,APL_ENV_FILE=/apl/conf/env.txt"

"EXTPROC_DLLS=ONLY:/home/xyz/mylib.so:/home/abc/urlib.so,
LD_LIBRARY_PATH=/private/xpm/lib:/private/mylibs, 
MYPATH=/usr/ucb:/usr/local/packages,APL_ENV_FILE=/apl/conf/env.txt"

"EXTPROC_DLLS=ANY,LD_LIBRARY_PATH=/private/xpm/lib:/private/mylibs, 
MYPATH=/usr/ucb:/usr/local/packages,APL_ENV_FILE=/apl/conf/env.txt"

ノート:

有効なユーザーと実際のユーザー、または有効なグループと実際のグループが異なる場合、LD_LIBRARY_PATH環境設定は無視されます。

Oracleホーム・ディレクトリ

ORACLE_HOME

エージェントのOracleホームの場所。

Oracleシステム識別子(SID)

SID_NAME

外部プロシージャ・エージェントのシステム識別子(任意の名前)。

Oracleリスナーによって生成された外部プロシージャ・エージェントの使用方法の詳細は、外部プロシージャを使用する場合のOracle Net Servicesの構成の例を参照してください。

脚注1

DLLは、Microsoft Windowsではセミコロン(;)で区切ります。

ノート:

外部プロシージャのデフォルト構成では、ネットワーク・リスナーがOracle Databaseおよびextprocエージェントを使用する必要はありません。extprocエージェントはOracle Databaseによって直接生成されるため、Oracleリスナーによって予期せずextprocエージェントが生成される恐れはありません。セキュリティを最大限にするため、このデフォルト構成をお薦めします。

外部プロシージャのデフォルト構成を変更し、Oracleリスナーによってextprocエージェントを生成できます。このためには、追加のネットワーク構成ステップを実行する必要があります。

次のものを使用する場合、Oracleリスナーによってextprocエージェントを生成する必要があります。

  • マルチスレッド・エージェント

  • MTSモードのOracle Database(Microsoft Windows)

  • 外部プロシージャを別のextprocエージェントにリダイレクトできるような、LIBRARY指定のAGENT句またはPROCEDURE指定のAGENT IN句。

関連項目:

外部プロシージャの保護の詳細は、『Oracle Databaseセキュリティ・ガイド』を参照してください。

13.6.1.1 外部プロシージャを使用する場合のOracle Net Servicesの構成

外部プロシージャのデフォルト構成を変更し、旧リリースのOracle Databaseに類似したリスナーによってextprocエージェントを生成できます。プロセスは次のとおりです。

1. 既存のリスナーを構成するか、新規リスナーを作成して、外部プロシージャを処理します。

例13-1では、listener.oraファイルの構成例を示します。

例13-1 外部プロシージャを設定したlistener.oraファイル

LISTENER=
  (DESCRIPTION=
    (ADDRESS_LIST=
      (ADDRESS=(PROTOCOL=tcp)(HOST=sale-server)(PORT=1521))
      (ADDRESS=(PROTOCOL=ipc)(KEY=extproc))))
SID_LIST_LISTENER=
  (SID_LIST=
    (SID_DESC=
      (GLOBAL_DBNAME=sales.us.example.com)
      (ORACLE_HOME=/oracle)
      (SID_NAME=sales))
    (SID_DESC=
      (SID_NAME=plsextproc)
      (ORACLE_HOME=/oracle)
      (PROGRAM=extproc)))

2. tnsnames.oraに新しいエントリを追加します。

例13-2では、tnsnames.oraファイルの構成例を示します。

例13-2 外部プロシージャを設定したtnsnames.oraファイル

EXTPROC_CONNECTION_DATA_1=            
 (DESCRIPTION=                     
   (ADDRESS=(PROTOCOL=ipc)(KEY=extproc))                      
   (CONNECT_DATA=
    (SID=plsextproc)))

3. 外部プロシージャを別のextprocエージェント(Oracleリスナーによって生成されたextprocなど)にリダイレクトできるような、LIBRARY指定のAGENT句またはPROCEDURE指定のAGENT IN句を使用します。

$ cat test.c

#include <stdlib.h>
int negative(char* db, int n)
{
        return -1*n;
}

char* mygetenv(const char* env)
{
        return getenv(env);
}

$ gcc -shared -fPIC -o test.so test.c

$ cp test.so $ORACLE_HOME/lib

SQL*PLUSで、次を実行します。


DROP DATABASE LINK extproclink;
CREATE DATABASE LINK extproclink USING 'extproc_connection_data_1';

CREATE OR REPLACE LIBRARY test1 AS '$ORACLE_HOME/lib/test.so';
/

-- 
-- Use 'AGENT' clause in LIBRARY SPEC
-- 
CREATE OR REPLACE LIBRARY test2 AS '$ORACLE_HOME/lib/test.so' AGENT 'extproclink';
/

-- 
-- Use 'AGENT IN' clause in FUNCTION
-- 
CREATE OR REPLACE FUNCTION ftest1(x VARCHAR2, y BINARY_INTEGER)
RETURN BINARY_INTEGER
AS LANGUAGE C
LIBRARY test1
NAME "negative"
PARAMETERS(x STRING, y INT)
AGENT IN ( x );
/

CREATE OR REPLACE FUNCTION ftest2(x VARCHAR2)
RETURN VARCHAR2
AS LANGUAGE C
LIBRARY test2
NAME "mygetenv";
/

$ select ftest1('extproclink', 123) from dual;

$ select ftest2('LD_LIBRARY_PATH') from dual;

外部プロシージャのリスナーには、oracleユーザーが所有するファイルへの一般的なアクセス権のないユーザー・アカウントを含めないようにしてください。具体的には、このユーザーは、データベース・ファイルまたはOracleサーバーのアドレス空間に対する読取り権限または書込み権限を持つことはできません。また、このユーザーは、listener.oraファイルへの読取りアクセス権を持つ必要がありますが、書込みアクセス権は持つことはできません。

低い権限でリスナーを実行することによって、リスナー制御のSETコマンドを使用せずに、listener.oraファイルにあるリスナーの構成を変更できます。このため、オラクル社では、リスナーの実行前にlistener.oraファイルの構成を完了することをお薦めします。

13.6.1.1.1 外部プロシージャのデフォルト構成の変更

外部プロシージャのデフォルト構成を変更するには、外部プロシージャを処理するための別のリスナーまたは既存のリスナーを構成および実行します。次の手順では、デフォルトの構成を変更する方法について説明します。

  1. 次のようにOracle Net Configuration Assistantを使用して、外部プロシージャを処理するための既存のリスナーを構成します。ほとんどのインストールの場合、このリスナーの名前はLISTENERです。

    1. Oracle Enterprise Manager Cloud Controlの「Net Services管理」ページにアクセスします。

    2. 「管理」リストから「リスナー」を選択し、構成ファイルの場所を含むOracleホームを選択します。

    3. 「実行」をクリックします。

      「リスナー」ページが表示されます。

    4. Oracle Net Configuration Assistantによって生成された既存のリスナーを選択し、「編集」をクリックします。

      リスナーの編集ページが表示されます。

    5. アドレス・セクションで外部プロシージャのプロトコル・アドレスを選択し、「追加」をクリックします。

    6. 「その他のサービス」タブをクリックします。

    7. 外部プロシージャのサービス情報を表す行を選択し、「追加」をクリックします。

  2. 表13-6に示されるパラメータを含めたextprocに関するサービス情報を、listener.oraファイルに追加します。

13.6.1.1.2 外部プロシージャを実行するための新規リスナーの作成

外部プロシージャを処理するための別のリスナーを構成および実行するには、Oracle Net Configuration Assistantを使用して別のリスナーの外部プロシージャ・エントリを作成します。次の手順では、新しいリスナーを作成する方法について説明します。

  1. 次のように、外部プロシージャを排他的に処理するリスナーを作成します。

    1. 「リスナー」ページにナビゲートします。

    2. 「作成」をクリックします。

      「リスナーを作成」ページが表示されます。

    3. 一意のリスナー名を「リスナー名」フィールドに入力します(「リスナー名」フィールドにLISTENEREXTPROCなど)。

  2. アドレス・セクションに、次のようにIPCプロトコル・アドレスを構成します。

    1. 「追加」をクリックします

      「アドレスの追加」ページが表示されます。

    2. 「プロトコル」リストからIPCを選択します。

    3. 「キー」フィールドに、extprocエージェントのキー値を入力します。

    4. 「OK」をクリックします。

      関連項目:

      リスナー・プロトコル・アドレスの構成の詳細は、「リスニング用プロトコル・アドレスの構成」を参照してください

  3. 表13-6に示されるパラメータを含めたextprocに関するサービス情報を、次のようにlistener.oraファイルに追加します。

    1. 「その他のサービス」タブをクリックします。

    2. 「追加」をクリックします

      「その他のサービスの作成」ページが表示されます。

    3. 次の値をフィールドに入力します。

      • extprocを「プログラム名」フィールドに。

      • extproc実行ファイルが存在するOracleホームを「Oracleホーム・ディレクトリ」フィールドに。

      • extprocなどのシステム識別子を「SID」フィールドに。

    4. 環境変数セクションで、「行の追加」をクリックします。

    5. EXTPROC_DLLS環境変数を「名前」フィールドに、DLLのディレクトリ・パスとファイル名を「値」フィールドに入力します。

    6. 「OK」をクリックします。

      「リスナーを作成」ページが表示されます。

    7. 「OK」をクリックしてリスナーを追加します。

      リスナーが「リスナー」ページに追加されます。

      listener.oraファイルの外部プロシージャに関する情報は、次の出力のように更新されます。

      LISTENEREXTPROC=
       (DESCRIPTION=
        (ADDRESS=
           (PROTOCOL=ipc)(KEY=extproc)))
      
  4. oracleユーザーより低い権限のユーザー・アカウントから、外部プロシージャのリスナーを起動します。

関連項目: