39.1. 安装过程语言

如果你要使用某种过程语言,那么你必须把它"安装"到要使用它的数据库里。 不过那些安装到数据库template1里的过程语言会自动在随后创建的数据库中安装。 因为template1中的目录通过CREATE DATABASE进行拷贝, 因此数据库管理员可以决定哪个数据库可以使用哪种语言, 以及决定缺省时可以使用哪些语言。

对于那些随着标准版本发布的语言, 只需要使用CREATE EXTENSION _language_name_把语言安装到当前数据库中即可。 另外,也可以使用createlang程序在shell命令行上安装语言。 比如,要将PL/Perl安装到template1数据库中,可以使用:

createlang plperl template1

推荐下面描述的手工程序来安装没有作为扩展包装的定制语言。

手工安装过程语言

一个过程语言是按五个步骤安装到数据库里面去的, 这些任务必须由数据库超级用户执行。 在大多数情况下所需的SQL命令应该被打包成"扩展"的安装脚本, 因此CREATE EXTENSION可以用于执行它们。

  1. 必须编译和安装该语言处理器的共享对象并安装到一个合适的库目录中。 方法和安装用户定义的 C 函数的方法(Section 35.9.6)一样。通常, 语言处理器需要外部库提供实际的引擎;如果是这样, 那么这些库也必须安装。

  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调用验证函数。 如果通过这种语言提供了验证函数,那么用下面的命令声明

    CREATE FUNCTION _validator_function_name_(oid)
        RETURNS void
        AS '_path-to-shared-object_'
        LANGUAGE C STRICT;
    
  5. 最后,PL必须通过下面的命令声明

    CREATE [TRUSTED] [PROCEDURAL] LANGUAGE _language-name_
        HANDLER _handler_function_name_
        [INLINE `_inline_function_name_`]
        [VALIDATOR `_validator_function_name_`] ;
    

    可选关键字TRUSTED指明该语言不授予访问用户不拥有的数据的权限, 为一个没有超级用户权限的普通数据库用户设计可信任语言, 并且允许他们安全地使用这种语言创建函数和触发器过程。 因为 PL 函数在数据库服务器中执行, 所以TRUSTED标志应该只是用于那些不允许访问数据库服务器内部或文件系统的语言。 PL/pgSQL, PL/Tcl和 PL/Perl语言都是可信的。PL/TclU, PL/PerlU和 PL/PythonU 都被设计成提供无限的功能,因此不应该标记为可信。

Example 39-1显示了如何手工安装PL/Perl语言。

Example 39-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;

CREATE FUNCTION plperl_validator(oid) RETURNS void AS
    '$libdir/plperl' LANGUAGE C STRICT;

命令:

CREATE TRUSTED PROCEDURAL 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 的处理器也都被编译并安装到同一个库目录中。 但是语言自身缺省不安装到任何数据库中,类似的, 如果配置了Perl支持,则PL/Perl和PL/PerlU的处理器也都编译并且安装。 并且如果配置了Python支持,则安装PL/PythonU处理器。 但是这些语言缺省不安装。