[11/15開催: PostgreSQL Conference Japan 2019 参加受付中] 
他のバージョンの文書 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

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

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

標準ディストリビューションで入っている言語に関しては、手動で実行するのではなく、createlang シェルスクリプトを使用することができます。例えば、PL/pgSQL を template1 のデータベースにインストールするには、下記のように実行して下さい。

createlang plpgsql template1

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

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

手続き言語は、データベースのスーパユーザによって、次の 3 段階でデータベースにインストールすることができます。

  1. まず、その言語のハンドラ用の共有オブジェクトがコンパイルされ、インストールされている必要があります。これは C で作成したユーザ定義関数を作成してインストールする時と同じです。Section 9.5.8 を参照して下さい。

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

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

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

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

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

    TRUSTED というオプションキーワードは、スーパーユーザの権利を持たない一般ユーザがこの言語を使って関数やトリガプロシージャを作成できるかどうかを知らせます。PL 関数はデータベースサーバの内部で実行されますので、TRUSTED フラグはデータベースサーバ内部やファイルシステムへのアクセスを持たない言語のみが使われるべきです。PL/pgSQLPL/TclPL/PerlPL/Python では使用できることが確認できています。 提供される機能に制限がない PL/TclU では使用しないで下さい。

PostgreSQLのデフォルトのインストールでは、PL/pgSQL 言語のハンドラは構築され、"library" ディレクトリにインストールされます。 Tcl/Tk サポートが設定された場合、PL/TclPL/TclU のハンドラも構築され、同じ場所にインストールされます。 同様に Perl サポートが設定された場合、PL/PerlPL/PerlU のハンドラも構築され、同じ場所にインストールされます。 Python サポートが設定された場合も同様に、PL/Python のハンドラがインストールされます。createlang スクリプトは上記の step 2step 3を自動的に実行します。

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

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

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

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

CREATE TRUSTED PROCEDURAL LANGUAGE plpgsql
    HANDLER plpgsql_call_handler;