38.5. 可信的和不可信的 PL/Perl

通常,PL/Perl 是作为一种叫 plperl"可信的"编程语言安装的。 在这种设置中,为了保持安全,某些 Perl 操作被关闭掉了。通常, 受限制的操作都是那些和环境相互交互的动作。这包括文件句柄操作, require,和 use(对于外部模块)。 我们没有办法访问数据库服务器进程内部或者获取具有服务器进程权限的 OS 级别的访问,就像 C 函数那样。 因此,任何非特权的数据库用户都可以允许使用这种语言。

这里是一个无法运转的函数的例子,因为出于安全原因, 文件系统的操作是不允许的:

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": $!});
$$ LANGUAGE plperl;

创建这个函数将会失败,因为它使用的非法调用将会被验证器捕获。

有时候我们想写不受限制的 Perl 函数。比如,我们可能需要一个能发送邮件的 Perl 函数。 为了处理这种情况,PL/Perl 也可以安装为"不可信"的语言(通常叫做 PL/PerlU)。 在这种情况下,我们可以使用完整的 Perl 语言。如果用 createlang 安装该语言,那么用 plperlu 这个名字可以选取不可信的 PL/Perl 变种。

PL/PerlU 函数的作者必须注意不能把该函数用于做任何不想做的事情, 因为它可以干任何以数据库管理员身份登录的用户能干的事情。 请注意数据库系统只允许数据库超级用户创建不可信语言写的函数。

如果上面的函数由超级用户用 plperlu 创建,那么执行就会成功。