18.2. 安装过程语言

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

对于那些随着标准版本发布的语言,你可以使用 createlang shell 脚本而不用自己事无巨细地 自己做.比如,要安装PL/pgSQL到 template1 数据库中,使用

createlang plpgsql template1

下面描述的收工安装的方法只是适用于那些 createlang 还不知道的客户语言.

手工的过程语言安装

一个过程语言是按三个步骤安装到数据库里面去的, 这些任务必须由数据库超级用户执行.

  1. 我们必须被编译和安装该语言句柄的共享对象(目标)必须 安装到一个合适的库目录.这里用的方法和制作安装用户定义的 C 函数的方法是一样的.见 Section 9.5.8

  2. 句柄必须用下面命令声明

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

    特殊的返回类型 LANGUAGE_HANDLER 告诉数据库, 这个函数并不返回一个已定义的 SQL 数据类型并且是不能直接在 SQL 语句里面使用.

  3. PL 必须用下面命令定义

    CREATE [TRUSTED] [PROCEDURAL] LANGUAGE 'language-name'
        HANDLER handler_function_name
        LANCOMPILER 'description';

    可选的关键字 TRUSTED 指明一个没有超级用户权限的普通数据库用户能否使用这种语言创建函数 和触发器过程. 因为 PL 函数在数据库后端内部执行,所以TRUSTED标志 应该只是用于那些不允许访问数据库服务器内部或文件系统的语言. 语言PL/pgSQLPL/TclPL/Perl以及 PL/Python都被认为是可信的. PL/TclUPL/PerlU 是设计成提供无限的功能地,因此应该标记为可信的.

在缺省的 PostgreSQL 安装里,用于 PL/pgSQL语言的句柄是制作和安装到 "library" 目录里面 去的.如果你配置了Tcl/Tk支持,那么用于 PL/TclPL/TclU的句柄 也会编译并安装到同一个位置.类似地,如果你配置了 Perl 支持, 那么也会制作和安装PL/PerlPL/TclU的句柄. createlang 脚本可以为我们自动做上面描述的两个 step 2step 3步骤.

Example 18-1. 收工安装 PL/pgSQL

下面的命令告诉数据库到那里才能找到用于 PL/pgSQL语言的调用句柄函数的共享对象(目标).

CREATE FUNCTION plpgsql_call_handler () RETURNS LANGUAGE_HANDLER AS
    '$libdir/plpgsql' LANGUAGE C;

下面的命令

CREATE TRUSTED PROCEDURAL LANGUAGE 'plpgsql'
    HANDLER plpgsql_call_handler
    LANCOMPILER 'PL/pgSQL';

声明了前面所定义的调用句柄函数应该是在调用语言属性是 plpgsql的函数,或触发器过程被调用的时候使用.