37.1. 手続き言語のインストール

手続き言語は、それらが使用されるデータベース全てに"インストール"されている必要があります。 しかし、template1データベースにインストールされた手続き言語は、template1内の項目はCREATE DATABASEによってコピーされますので、その後に作成された全てのデータベースで自動的に使用できます。 したがって、データベース管理者はどのデータベースにどの言語を使用するかを決定できますし、デフォルトで使用できる言語も決定できます。

標準配布物で提供される言語では、その言語を現在のデータベースにインストールするにはCREATE LANGUAGE language_name の実行のみが必要です。 シェルコマンドラインからcreatelang プログラムを使用してこれを行うこともできます。 例えば、PL/pgSQLtemplate1データベースにインストールするには、下記のように実行してください。

createlang plpgsql template1

下記の手作業はCREATE LANGUAGEが認識できない独自の言語に対してのみ使用することを推奨します。

手続き言語の手作業によるインストール方法

手続き言語を次の4段階でデータベースにインストールすることができます。 この作業はデータベースのスーパーユーザで行う必要があります。 (CREATE LANGUAGEが認知できる言語では、2番目と3番目の処理は省略できます。必要ならば自動的に行われるからです。)

  1. その言語ハンドラ用の共有オブジェクトがコンパイルされ、適切なライブラリディレクトリにインストールされている必要があります。 これは、通常のユーザ定義のC関数を作成してインストールする時と同じです。 項34.9.6を参照してください。 実際のプログラミング言語エンジンを提供する外部ライブラリに、言語ハンドラが依存していることがよくあります。 この場合はそのライブラリもインストールしなければなりません。

  2. ハンドラは下記のコマンドで宣言されなければなりません。

    CREATE FUNCTION handler_function_name()
        RETURNS language_handler
        AS 'path-to-shared-object'
        LANGUAGE C;

    language_handlerという特別な戻り値の型は、この関数が定義済みのSQLデータ型を返さず、SQL文では直接使用できないことをデータベースに伝えます。

  3. 省略可能ですが、言語ハンドラは、実際に実行することなく関数定義の正確性を検査する"有効性検査"関数を提供することができます。 もし存在すれば、有効性検査関数はCREATE FUNCTIONで呼び出されます。 有効性検査関数はハンドラによって提供され、以下のようなコマンドで宣言されます。

    CREATE FUNCTION validator_function_name(oid)
        RETURNS void
        AS 'path-to-shared-object'
        LANGUAGE C;

  4. PLは下記のコマンドで宣言されなければいけません。

    CREATE [TRUSTED] [PROCEDURAL] LANGUAGE language-name
        HANDLER handler_function_name
        [VALIDATOR validator_function_name] ;

    TRUSTEDというオプションキーワードは、スーパーユーザ権限を持たない一般ユーザがこの言語を使って関数やトリガプロシージャを作成できるかどうかを指定します。 PL関数はデータベースサーバの内部で実行されますので、TRUSTEDフラグはデータベースサーバ内部やファイルシステムへのアクセスを持たない言語のみが使わなければなりません。 PL/pgSQLPL/TclPL/Perl言語はTRUSTEDの対象と考えられています。 提供される機能が無制限に設計されているPL/TclUPL/PerlUPL/PythonU言語については、TRUSTEDを指定してはなりません

例37-1に、手作業によるインストール手順がPL/pgSQL言語でどのように動作するかを示します。

例 37-1. PL/pgSQLの手作業によるインストール

以下のコマンドは、データベースサーバにPL/pgSQL言語の呼び出しハンドラ関数用の共有ライブラリの存在場所を通知します。

CREATE FUNCTION plpgsql_call_handler() RETURNS language_handler AS
    '$libdir/plpgsql' LANGUAGE C;

PL/pgSQLは有効性検査関数を有していますので、以下のようにも宣言できます。

CREATE FUNCTION plpgsql_validator(oid) RETURNS void AS
    '$libdir/plpgsql' LANGUAGE C;

以下のコマンドは、直前に宣言された関数を、言語属性がplpgsqlである関数やトリガプロシージャ用に呼び出さなければならないことを定義します。

CREATE TRUSTED PROCEDURAL LANGUAGE plpgsql
    HANDLER plpgsql_call_handler
    VALIDATOR plpgsql_validator;

デフォルトのPostgreSQLインストレーションでは、PL/pgSQL言語用のハンドラは構築され、"library"ディレクトリにインストールされます。 Tclのサポート付きで構築した場合、PL/TclPL/TclU用のハンドラも構築され同じ場所にインストールされます。 同様に、Perlサポート付きで構築した場合はPL/PerlPL/PerlUハンドラが、Pythonサポート付きで構築した場合はPL/PythonUが構築され、インストールされます。