# 45.5.可信和不可信的PL/Perl
通常,PL/Perl是作为一种名为plperl
。在此设置中,某些Perl操作被禁用以保持安全性。一般来说,受限制的操作是那些与环境交互的操作。这包括文件句柄操作,要求
和使用
(对于外部模块)。无法像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": $!});
return 1;
$$ LANGUAGE plperl;
此函数的创建将失败,因为它使用的禁止操作将被验证程序捕获。
有时,编写不受限制的Perl函数是可取的。例如,可能需要一个发送邮件的Perl函数。为了处理这些情况,PL/Perl还可以作为“不受信任”的语言安装(通常称为PL/PerlU)).在这种情况下,可以使用完整的Perl语言。安装语言时,请输入语言名称普帕鲁
将选择不受信任的PL/Perl变体。
PL/PerlU函数的编写者必须注意,该函数不能用于做任何不需要的事情,因为它将能够做任何可以由作为数据库管理员登录的用户完成的事情。请注意,数据库系统只允许数据库超级用户使用不受信任的语言创建函数。
如果上述函数是由超级用户使用该语言创建的普帕鲁
,执行就会成功。
同样,如果将Perl语言指定为普帕鲁
而不是plperl
,但调用方必须是超级用户。
# 笔记
对于每个SQL角色,PL/Perl函数在单独的Perl解释器中运行,而在给定会话中执行的所有PL/PerlU函数都在单个Perl解释器中运行(这不是用于PL/Perl函数的任何解释器)。这允许PL/PerlU函数自由共享数据,但PL/Perl和PL/PerlU函数之间不能进行通信。
# 笔记
Perl不能在一个进程中支持多个解释器,除非它是用适当的标志构建的,即用途多样性
或useithreads
. (用途多样性
除非您确实需要使用线程,否则最好使用。有关更多详细信息,请参阅问题手册页。)如果PL/Perl与未以这种方式构建的Perl副本一起使用,那么每个会话只能有一个Perl解释器,因此任何一个会话只能执行PL/PerlU函数,或由同一SQL角色调用的PL/Perl函数。