通常,PL/Perl 是作为一种叫 plperl 的 "可信的"编程语言安装的。 在这种设置中,为了保持安全,某些 Perl 操作被关闭掉了。通常, 受限制的操作都是那些和环境相互交互的动作。这包括文件句柄操作, require,和 use(对于外部模块)。 我们没有办法访问数据库后端进程内部或者获取具有 PostgreSQL 用户 ID 权限的OS级别的访问,就像 C 函数那样。因此,任何非特权的 数据库用户都可以允许使用这种语言。
这里是一个无法运转的函数的例子,因为出于安全原因, 文件系统的操作是不允许的:
CREATE FUNCTION badfunc() RETURNS integer AS ' open(TEMP, ">/tmp/badfile"); print TEMP "Gotcha!\n"; return 1; ' LANGUAGE plperl;
这个函数的创建是可以的,但是不能执行它。
有时候我们想写不受限制的 Perl 函数 --- 比如,我们可能需要一个 能发送邮件的 Perl 函数。为了处理这种情况,PL/Perl 也可以安装为 "不可信" 的语言(通常叫做 PL/PerlU)。 在这种情况下,我们可以使用完整的 Perl 语言。如果用 createlang 安装该语言,那么用 plperlu 这个名字就可以选取 不可信的 PL/Perl 变种。
PL/PerlU 函数的作者必须注意不能把该函数用于做任何 不想做的事情,因为它可以干任何以数据库管理员身份登录的用户能干的事情。 请注意数据库系统只允许数据库超级用户创建不可信语言写的函数。
如果上面的函数由超级用户用 plperlu 创建,那么 执行就会成功。