过程语言必须被“安装”到每个要使用该语言的数据库中。但是,安装在 template1
数据库中的过程语言在所有后续创建的数据库中都是自动可用的,因为它们在 template1
中的条目会被 CREATE DATABASE
命令复制。因此,数据库管理员可以决定在哪些数据库中可用哪些语言,并可以在需要时使某些语言默认可用。
对于标准发行版中提供的语言,只需执行 CREATE EXTENSION
language_name
即可将语言安装到当前数据库。下面描述的手动过程仅推荐用于安装尚未打包为扩展的语言。
手动安装过程语言
过程语言的安装在一个数据库中有五个步骤,必须由数据库超级用户执行。在大多数情况下,所需的 SQL 命令应该打包成一个“扩展”的安装脚本,以便可以使用 CREATE EXTENSION
来执行它们。
语言处理器的共享对象必须被编译并安装到一个合适的库目录中。这与构建和安装普通用户定义 C 函数的模块的方式相同;参见 第 36.10.5 节。通常,语言处理器会依赖一个提供实际编程语言引擎的外部库;如果是这样,该库也必须被安装。
必须使用以下命令声明处理器
CREATE FUNCTIONhandler_function_name
() RETURNS language_handler AS 'path-to-shared-object
' LANGUAGE C;
特殊的返回类型 language_handler
告诉数据库系统该函数不返回已定义的SQL数据类型,并且不能直接用于SQL语句。
可选地,语言处理器可以提供一个“内联”处理器函数,该函数用于执行用该语言编写的匿名代码块(DO
命令)。如果语言提供了内联处理器函数,请使用类似以下命令的命令声明它:
CREATE FUNCTIONinline_function_name
(internal) RETURNS void AS 'path-to-shared-object
' LANGUAGE C;
可选地,语言处理器可以提供一个“验证器”函数,该函数可以在不实际执行函数定义的情况下检查其正确性。如果存在验证器函数,CREATE FUNCTION
将调用该函数。如果语言提供了验证器函数,请使用类似以下命令的命令声明它:
CREATE FUNCTIONvalidator_function_name
(oid) RETURNS void AS 'path-to-shared-object
' LANGUAGE C STRICT;
最后,必须使用以下命令声明 PL:
CREATE [TRUSTED] LANGUAGElanguage_name
HANDLERhandler_function_name
[INLINEinline_function_name
] [VALIDATORvalidator_function_name
] ;
可选关键字 TRUSTED
指定该语言不授予用户本来无法访问的数据。受信任的语言是为普通数据库用户(没有超级用户权限的用户)设计的,并允许他们安全地创建函数和过程。由于 PL 函数在数据库服务器内部执行,因此 TRUSTED
标志只能用于不允许访问数据库服务器内部或文件系统的语言。PL/pgSQL、PL/Tcl 和 PL/Perl 被认为是受信任的;PL/TclU、PL/PerlU 和 PL/PythonU 的设计目的是提供无限功能,并且 不 应该被标记为受信任。
示例 40.1 展示了手动安装过程如何与 PL/Perl 语言配合使用。
示例 40.1. 手动安装 PL/Perl
以下命令告诉数据库服务器在哪里可以找到 PL/Perl 语言调用处理器函数的共享对象
CREATE FUNCTION plperl_call_handler() RETURNS language_handler AS '$libdir/plperl' LANGUAGE C;
PL/Perl 有一个内联处理器函数和一个验证器函数,所以我们也声明它们
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;
然后定义,在语言属性为 plperl
的函数和过程中调用先前声明的函数。
在默认的 PostgreSQL 安装中,PL/pgSQL 语言的处理器被编译并安装到“库”目录中;此外,PL/pgSQL 语言本身就安装在所有数据库中。如果配置了 Tcl 支持,PL/Tcl 和 PL/TclU 的处理器会被编译并安装到库目录中,但该语言本身默认不会安装到任何数据库中。同样,如果配置了 Perl 支持,PL/Perl 和 PL/PerlU 的处理器会被编译并安装,如果配置了 Python 支持,PL/PythonU 的处理器会被安装,但这些语言默认不会被安装。
如果您在文档中发现任何不正确之处、与您对特定功能的体验不符之处或需要进一步澄清之处,请使用 此表单 报告文档问题。