手続き言語は、それらが使用されるデータベースすべてに「インストール」されている必要があります。
しかし、template1
データベースにインストールされた手続き言語は、template1
内の項目はCREATE DATABASE
によってコピーされますので、その後に作成されたすべてのデータベースで自動的に使用できます。
したがって、データベース管理者はどのデータベースにどの言語を使用するかを決定できますし、デフォルトで使用できる言語も決定できます。
標準配布物で提供される言語では、その言語を現在のデータベースにインストールするにはCREATE EXTENSION
language_name
の実行のみが必要です。
シェルコマンドラインからcreatelangプログラムを使用してこれを行うこともできます。
例えば、PL/Perlをtemplate1
データベースにインストールするには、下記のように実行してください。
createlang plperl template1
下記の手作業は、拡張機能としてパッケージ化されていない言語をインストールする場合にのみ行うことを推奨します。
手続き言語の手作業によるインストール方法
手続き言語を次の5段階でデータベースにインストールすることができます。
この作業はデータベースのスーパーユーザで行う必要があります。
ほとんどの場合、必要なSQLコマンドは「拡張機能」のインストールスクリプトとしてパッケージ化されていますので、この作業を実行するのにCREATE EXTENSION
が利用できます。
その言語ハンドラ用の共有オブジェクトがコンパイルされ、適切なライブラリディレクトリにインストールされている必要があります。 これは、通常のユーザ定義のC関数を作成してインストールする時と同じです。 36.9.6. 動的にロードされる関数のコンパイルとリンクを参照してください。 実際のプログラミング言語エンジンを提供する外部ライブラリに、言語ハンドラが依存していることがよくあります。 この場合はそのライブラリもインストールしなければなりません。
ハンドラは下記のコマンドで宣言されなければなりません。
CREATE FUNCTIONhandler_function_name
() RETURNS language_handler AS 'path-to-shared-object
' LANGUAGE C;
language_handler
という特別な戻り値の型は、この関数が定義済みのSQLデータ型を返さず、SQL文では直接使用できないことをデータベースシステムに伝えます。
省略可能ですが、言語ハンドラは、この言語で書かれた無名コードブロック(DO コマンド)を実行する「インライン」ハンドラ関数を提供することができます。 インラインハンドラ関数が言語により提供されるのであれば、以下のようなコマンドで宣言されます。
CREATE FUNCTIONinline_function_name
(internal) RETURNS void AS 'path-to-shared-object
' LANGUAGE C;
省略可能ですが、言語ハンドラは、実際に実行することなく関数定義の正確性を検査する「有効性検査」関数を提供することができます。
もし存在すれば、有効性検査関数はCREATE FUNCTION
で呼び出されます。
有効性検査関数が言語により提供されるのであれば、以下のようなコマンドで宣言されます。
CREATE FUNCTIONvalidator_function_name
(oid) RETURNS void AS 'path-to-shared-object
' LANGUAGE C STRICT;
最終的に、PLは下記のコマンドで宣言されなければいけません。
CREATE [TRUSTED] [PROCEDURAL] LANGUAGElanguage-name
HANDLERhandler_function_name
[INLINEinline_function_name
] [VALIDATORvalidator_function_name
] ;
TRUSTED
というオプションキーワードは、ユーザがアクセス権を持たないデータに対して、その言語がアクセス権を持たないことを指定します。
TRUSTED
である言語は(スーパーユーザ権限を持たない)一般ユーザ用に設計されており、安全に関数やトリガプロシージャを作成できます。
PL関数はデータベースサーバの内部で実行されますので、TRUSTED
フラグはデータベースサーバ内部やファイルシステムへのアクセスを持たない言語のみが使わなければなりません。
PL/pgSQLとPL/Tcl、PL/Perl言語はTRUSTED
と考えられています。
提供される機能が無制限に設計されているPL/TclU、PL/PerlU、PL/PythonU言語については、TRUSTED
を指定してはなりません。
例40.1「PL/Perlの手作業によるインストール」に、手作業によるインストール手順がPL/Perl言語でどのように動作するかを示します。
例40.1 PL/Perlの手作業によるインストール
以下のコマンドは、データベースサーバにPL/Perl言語の呼び出しハンドラ関数用の共有ライブラリの存在場所を通知します。
CREATE FUNCTION plperl_call_handler() RETURNS language_handler AS '$libdir/plperl' LANGUAGE C;
PL/Perlはインラインハンドラ関数と有効性検査関数を有していますので、以下のようにも宣言します。
CREATE FUNCTION plperl_inline_handler(internal) RETURNS void AS '$libdir/plperl' LANGUAGE C; CREATE FUNCTION plperl_validator(oid) RETURNS void AS '$libdir/plperl' LANGUAGE C STRICT;
以下のコマンドは、直前に宣言された関数を、言語属性がplperl
である関数やトリガプロシージャ用に呼び出さなければならないことを定義します。
CREATE TRUSTED PROCEDURAL LANGUAGE plperl HANDLER plperl_call_handler INLINE plperl_inline_handler VALIDATOR plperl_validator;
デフォルトのPostgreSQLインストレーションでは、PL/pgSQL言語用のハンドラは構築され、「ライブラリ」ディレクトリにインストールされます。 さらに、PL/pgSQL言語自体がデータベースすべてにインストールされます。 Tclのサポート付きで構築した場合、PL/TclとPL/TclU用のハンドラも構築されライブラリディレクトリにインストールされますが、言語自体はデフォルトではどのデータベースにもインストールされません。 同様に、Perlサポート付きで構築した場合はPL/PerlとPL/PerlUハンドラが、Pythonサポート付きで構築した場合はPL/PythonUハンドラが構築され、インストールされますが、言語自体はデフォルトではインストールされません。