通常、PL/Perlはplperl
という名前で「信頼された」プログラミング言語としてインストールされます。
この設定では、セキュリティを確保するためにPerlの特定の操作は無効にされます。
一般的には、制限される操作は環境に作用するものです。
これには、ファイルハンドル操作やrequire
、use
(外部モジュール用)が含まれます。
C関数では可能ですが、Perlでは、データベースサーバ内部にアクセスする方法や、サーバプロセスの権限によるOSレベルのアクセスを行う方法はありません。
この結果、データベースの全ての非特権ユーザはこの言語を使用することができます。
セキュリティ上の理由により許されていないファイルシステム操作を行うため、うまく動作しない関数の例を以下に示します。
CREATE FUNCTION badfunc() RETURNS integer AS $$ my $tmpfile = "/tmp/badfile"; open my $fh, '>', $tmpfile or elog(ERROR, qq{could not open the file "$tmpfile": $!}); print $fh "Testing writing to a file\n"; close $fh or elog(ERROR, qq{could not close the file "$tmpfile": $!}); return 1; $$ LANGUAGE plperl;
許されていない操作の使用が検証機能によって検出されますので、この関数の作成は失敗します。
制限のないPerl関数の作成が望ましい場合があります。
例えば、Perl 関数を使用してメールを送信するような場合です。
このような場合を扱うために、PL/Perlを「信頼されない」言語(通常PL/PerlUと呼ばれます)としてインストールすることもできます。
この場合は完全なPerl言語を使用することができます。
言語がインストールされた場合、plperlu
という言語名によって、信頼されないPL/Perlの亜種が選択されます。
PL/PerlU関数の作成者は、その関数を不必要なことに使用できないように注意する必要があります。 この関数は、データベース管理者としてログインしたユーザが実行できることを全て実行できるからです。 データベースシステムはデータベースのスーパーユーザにのみ信頼されない言語による関数作成を許可していることに注意してください。
上記の関数が、スーパーユーザによってplperlu
言語を使用して作成された場合、実行は可能となります。
同じ方法で、言語をplperl
ではなくplperlu
と指定することで、Perl内に作成された匿名コードブロックは制限された操作を使用することができます。
ただし呼び出し元はスーパーユーザでなければなりません。
PL/Perl関数はSQLロール毎に別々のPerlインタプリタ内で実行されますが、あるセッションで実行されるPL/PerlU関数はすべて、単一のPerlインタプリタ(PL/Perl関数用に使用されるインタプリタのいずれかではありません)内で実行されます。 これによりPL/PerlU関数はデータを自由に共有することができます。 しかしPL/Perl関数とPL/PerlU関数の間で通信することはできません。
Perlは適切なフラグ、すなわちusemultiplicity
またはuseithreads
を付けて構築していない限り、1つのプロセス内で複数のインタプリタをサポートすることはできません。
(実際にスレッドの使用が必要でなければusemultiplicity
を勧めます。
詳細はperlembedマニュアルページを参照してください。)
PL/Perlがこの方法で構築されていないPerlのコピーを使用する場合、1つのセッション内で1つのPerlインタプリタしか持つことができません。
このため、1つのセッションでは、PL/PerlU関数、もしくは、すべて同一のSQLロールで呼び出されるPL/Perl関数のいずれかのみを実行することができます。