通常,PL/Perl 安装为名为 plperl
的 “受信任” 编程语言。在这种设置中,某些 Perl 操作被禁用以维护安全。一般来说,受限的操作是那些与环境交互的操作。这包括文件句柄操作、require
和 use
(对于外部模块)。无法访问数据库服务器进程的内部或以服务器进程的权限获得操作系统级别的访问权限,就像 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 语言可用。在安装语言时,语言名称 plperlu
将选择不受信任的 PL/Perl 变体。
PL/PerlU 函数的编写者必须确保该函数不能用于执行任何不需要的操作,因为它将能够执行数据库管理员登录后可以执行的任何操作。请注意,数据库系统只允许数据库超级用户在不受信任的语言中创建函数。
如果上述函数是由超级用户使用语言 plperlu
创建的,则执行将成功。
以同样的方式,如果语言指定为 plperlu
而不是 plperl
,则 Perl 中编写的匿名代码块可以使用受限操作,但调用者必须是超级用户。
虽然 PL/Perl 函数在每个 SQL 角色的独立 Perl 解释器中运行,但所有在给定会话中执行的 PL/PerlU 函数都在单个 Perl 解释器中运行(这不是用于 PL/Perl 函数的任何解释器)。这允许 PL/PerlU 函数自由共享数据,但 PL/Perl 和 PL/PerlU 函数之间不能进行任何通信。
Perl 无法在一个进程中支持多个解释器,除非它是在使用适当标志的情况下构建的,即 usemultiplicity
或 useithreads
。(除非您实际上需要使用线程,否则首选 usemultiplicity
。有关更多详细信息,请参见 perlembed 手册页。)如果 PL/Perl 与未以这种方式构建的 Perl 副本一起使用,则每个会话只能有一个 Perl 解释器,因此任何一个会话只能执行 PL/PerlU 函数,或者由同一个 SQL 角色调用的 PL/Perl 函数。
如果您在文档中发现任何错误,与您对特定功能的体验不符,或者需要进一步澄清,请使用 此表格 报告文档问题。