在每一个要使用过程语言的数据库中都必须“安装”相应的过程语言。不过安装在数据库template1
中的过程语言会被后续创建的数据库自动继承,因为template1
中与过程语言相关的项会被CREATE DATABASE
复制。因此,数据库管理员可以决定在哪些数据库中可以使用哪些语言,并且按照选择让一些语言默认可用。
对于标准发布所提供的语言,只需要执行CREATE EXTENSION
language_name
来把该语言安装在当前数据库中。
下文所述的手工过程主要是为了安装没有被包装成扩展的语言。
手工安装过程语言
安装一个过程语言到一个数据库中包括五个步骤,且必须由一个数据库超级用户来执行。在大部分情况下,所需的 SQL 命令应该被打包成一个“扩展”的安装脚本,这样可以用CREATE EXTENSION
来执行它们。
用于语言处理器的共享对象必须被编译并安装到一个合适的库目录中。这和编译和安装常规的用户定义 C 函数一样,参见Section 38.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/sql 被认为是受信任的。
在一个默认的LightDB安装中,用于PL/pgSQL语言的处理器会被编译并且安装到“library”目录,此外PL/pgSQL语言本身会被安装在所有的数据库中。