Postgresql 中文操作指南
45.8. PL/Perl Under the Hood #
45.8.1. Configuration #
此部分列出了影响 PL/Perl 的配置参数。
-
plperl.on_init (string) #
-
指定在 Perl 解释器首次初始化时要执行的 Perl 代码,即在 plperl 或 plperlu 专门使用它之前。此代码执行时 SPI 函数不可用。如果代码因错误而失败,它将中止解释器的初始化,并传播到调用查询,导致回滚当前事务或子事务。
-
Perl 代码限制在一个字符串中。较长的代码可以置于一个模块中,并由 on_init 字符串加载。示例:
-
plperl.on_init = 'require "plperlinit.pl"'
plperl.on_init = 'use lib "/my/app"; use MyApp::PgInit;'
-
由 plperl.on_init 加载的任何模块,直接或间接都可以由 plperl 使用。这可能会产生安全风险。要查看已加载的模块,可以使用:
DO 'elog(WARNING, join ", ", sort keys %INC)' LANGUAGE plperl;
-
如果 plperl 库包含在 shared_preload_libraries 中,那么初始化将在后端进程中发生,在这种情况下,应特别考虑使后端进程不稳定的风险。使用此功能的主要原因是:由 plperl.on_init 加载的 Perl 模块只需要在后端进程启动时加载,并且无需在各个数据库会话中加载就会立刻可用。但是,请记住,仅对数据库会话使用的第一个 Perl 解释器(对于调用 PL/Perl 函数的第一个 SQL 角色,即 PL/PerlU 或 PL/Perl)避免了开销。在数据库会话中创建的任何其他 Perl 解释器都必须重新执行 plperl.on_init。此外,在 Windows 上,预加载不会有任何节省,因为后端进程中创建的 Perl 解释器不会传播到子进程。
-
该参数只能在 postgresql.conf 文件或服务器命令行中设置。
-
plperl.on_plperl_init ( string ) plperl.on_plperlu_init ( string ) #
-
-
这些参数指定当 Perl 解释器专门用于 plperl 或 plperlu 时要执行的 Perl 代码。当 PL/Perl 或 PL/PerlU 函数首次在数据库会话中执行时,或者因为另一个语言被调用或 PL/Perl 函数由新 SQL 角色调用而必须创建其他解释器时,就会发生这种情况。这遵循 plperl.on_init 所做的任何初始化。执行此代码时 SPI 函数不可用。plperl.on_plperl_init 中的 Perl 代码在“锁定”解释器后执行,因此它只能执行受信任的操作。
-
如果代码因错误而失败,会中止初始化并传播到调用查询,从而导致中止当前事务或子事务。Perl 中已完成的所有操作都将不会撤消;但是,将不会再次使用该解释器。如果再次使用该语言,将在新的 Perl 解释器中再次尝试初始化。
-
只有超级用户可以更改这些设置。尽管这些设置可以在会话内更改,但这些更改不会影响已用于执行函数的 Perl 解释器。
-
plperl.use_strict (boolean) #
-
-
当设置为 true 时,PL/Perl 函数后续编译将启用 strict pragma。此参数不影响当前会话中已编译的函数。
45.8.2. Limitations and Missing Features #
PL/Perl 目前缺少以下功能,但它们会受到欢迎。