Skip to content

42.1. 安装过程语言#

过程语言必须“安装”到要使用的每个数据库中。但是,安装在数据库template1中的过程语言在所有随后创建的数据库中都会自动可用,因为template1中的条目将被CREATE DATABASE复制。因此,数据库管理员可以决定哪些语言可在哪些数据库中使用,并且可以根据需要使某些语言默认可用。

对于标准发行版中提供的语言,只需执行CREATE EXTENSION*language_name*即可将语言安装到当前数据库中。仅建议使用下面描述的手动过程安装未打包为扩展的语言。

手动过程语言安装

过程语言分五步安装在数据库中,必须由数据库超级用户执行。在大多数情况下,所需的 SQL 命令应打包为“扩展”的安装脚本,以便可以使用CREATE EXTENSION执行它们。

  1. 语言处理程序的共享对象必须编译并安装到适当的库目录中。这与使用常规用户定义的 C 函数构建和安装模块的方式相同;请参阅 第 38.10.5 节。通常,语言处理程序将依赖于提供实际编程语言引擎的外部库;如果是这样,也必须安装该库。

  2. 必须使用以下命令声明处理程序

    CREATE FUNCTION handler_function_name()
        RETURNS language_handler
        AS 'path-to-shared-object'
        LANGUAGE C;
    

    language_handler 的特殊返回类型告诉数据库系统此函数不返回已定义的 数据类型之一,并且不能直接在 语句中使用。

  3. 语言处理程序可以选择提供一个 内联 处理程序函数,该函数执行用此语言编写的匿名代码块(DO 命令)。如果语言提供了内联处理程序函数,请使用如下命令声明它

    CREATE FUNCTION inline_function_name(internal)
        RETURNS void
        AS 'path-to-shared-object'
        LANGUAGE C;
    
  4. 语言处理程序可以选择提供一个 验证器 函数,该函数检查函数定义的正确性,而无需实际执行它。如果存在,验证器函数将由 CREATE FUNCTION 调用。如果语言提供了验证器函数,请使用如下命令声明它

    CREATE FUNCTION validator_function_name(oid)
        RETURNS void
        AS 'path-to-shared-object'
        LANGUAGE C STRICT;
    
  5. 最后,必须使用以下命令声明 PL

    CREATE [TRUSTED] LANGUAGE language_name
        HANDLER handler_function_name
        [INLINE inline_function_name]
        [VALIDATOR validator_function_name] ;
    

    可选关键字 TRUSTED 指定该语言不会授予用户原本没有的数据访问权限。受信任语言专为普通数据库用户(没有超级用户权限的用户)设计,允许他们安全地创建函数和过程。由于 PL 函数在数据库服务器内部执行,因此 TRUSTED 标志应仅授予不允许访问数据库服务器内部或文件系统的语言。语言 PL/pgSQLPL/TclPL/Perl 被认为是受信任的;语言 PL/TclUPL/PerlUPL/PythonU 旨在提供无限功能,并且 应标记为受信任。

示例 42.1展示了手动安装过程如何使用语言PL/Perl。

示例 42.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语言的处理程序被构建并安装到“library”目录中;此外,PL/pgSQL语言本身安装在所有数据库中。如果配置了Tcl支持,则PL/Tcl和PL/TclU的处理程序将在 library 目录中构建并安装,但该语言本身默认不会安装在任何数据库中。同样,如果配置了 Perl 支持,则PL/Perl和PL/PerlU处理程序将被构建并安装,如果配置了 Python 支持,则PL/PythonU处理程序将被安装,但这些语言默认不会安装。