过程语言必须显式“安装”到需要使用它的具体数据库中。如果在系统模板库 template1 中预先安装了某种过程语言,后续通过克隆创建的所有新数据库都会自动继承并拥有该语言。
对于系统自带的标准过程语言,只需在目标数据库中直接执行 CREATE EXTENSION language_name 即可完成一键部署。本节介绍的底层手动安装流程通常仅适用于未打包为扩展插件的历史或第三方小众语言。
手动安装过程语言的标准步骤
手动安装过程语言需由数据库超级用户按以下五个步骤依次执行:
语言调用处理器的动态共享对象库文件必须编译并放置于数据库的系统插件库目录下(参见 Section 36.10.5)。若语言依赖底层的外部脚本引擎运行环境,必须确保宿主机已安装对应运行时。
使用如下命令声明语言处理器函数:
CREATE FUNCTIONhandler_function_name() RETURNS language_handler AS 'path-to-shared-object' LANGUAGE C;
特殊的返回值类型 language_handler 明确告知系统该函数是一个专用的语言调用处理器,严禁直接在常规 SQL 语句中当普通函数调用。
可选地,如果该语言支持执行匿名代码块(DO 命令),可以注册内联处理器函数:
CREATE FUNCTIONinline_function_name(internal) RETURNS void AS 'path-to-shared-object' LANGUAGE C;
可选地,可以提供一个验证器函数(Validator),用于在执行 CREATE FUNCTION 时对函数定义的语法正确性进行前置编译期静态校验:
CREATE FUNCTIONvalidator_function_name(oid) RETURNS void AS 'path-to-shared-object' LANGUAGE C STRICT;
最后,通过如下命令完成过程语言的最终注册:
CREATE [TRUSTED] LANGUAGElanguage_nameHANDLERhandler_function_name[INLINEinline_function_name] [VALIDATORvalidator_function_name] ;
可选关键字 TRUSTED(受信任)表明该语言运行在一个安全的隔离沙箱内,严禁该语言脚本直接访问底层服务器文件系统、执行系统调用或触碰未授权数据。被标记为受信任的语言允许普通非特权用户自由创建函数;而不受信任的语言(如 PL/PythonU 或 PL/PerlU,带有 U 后缀代表 Untrusted)由于赋予了操作系统级的完全访问特权,默认仅限超级用户使用。
Example 40.1. 手动安装 PL/Perl 示例
声明各入口函数并注册语言:
CREATE FUNCTION plperl_call_handler() RETURNS language_handler AS
'$libdir/plperl' LANGUAGE C;
CREATE FUNCTION plperl_inline_handler(internal) RETURNS void AS
'$libdir/plperl' LANGUAGE C STRICT;
CREATE FUNCTION plperl_validator(oid) RETURNS void AS
'$libdir/plperl' LANGUAGE C STRICT;
CREATE TRUSTED LANGUAGE plperl
HANDLER plperl_call_handler
INLINE plperl_inline_handler
VALIDATOR plperl_validator;
在标准官方安装包中,PL/pgSQL 语言默认在所有数据库中预装就绪。其余语言可通过执行 CREATE EXTENSION plperl; 或 CREATE EXTENSION plpython3u; 一键安装激活。