Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

40.1. 安装过程语言 #

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

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

手动过程语言安装

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

  1. 必须编译并安装语言处理器的共享对象到一个适当的库目录中。这与构建和安装带有常规用户定义 C 函数的模块相同;请参见第 36.10.5 节。通常,语言处理器需要依赖提供实际编程语言引擎的外部库;如果确实如此,也必须安装该库。

  2. 必须使用以下命令来声明处理器

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

    language_handler 的特殊返回类型会告诉数据库系统,此函数未返回已定义的任何SQL数据类型,并且无法在SQL语句中直接使用。

  3. 可选地,语言处理器可以提供一个“内置的处理器函数,用于执行用这种语言编写的匿名代码块(DO 命令)。如果语言提供了内置处理器函数,则使用以下命令声明该函数

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

    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 被设计为提供无限制的功能,因此 应标记为受信任。

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