↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3
历史版本PostgreSQL 7.4 已于 2010 年 10 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

39.4. 受信任与不受信任的 PL/Perl #

通常,PL/Perl 作为一个名为 plperl 的“受信任”编程 语言安装。在这种设置下, 某些 Perl 操作被禁用以保障 安全。一般来说, 受限制的是那些与环境 交互的操作。这包括文件句柄操作、 require 和 use(用于 外部模块)。没有办法访问 数据库服务器进程的内部,也无法以 服务器进程的权限获得 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 语言创建的, 执行就会成功。

注意

虽然 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 函数。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。