PL / Perl触发器不能使用.bashrc中定义的ENV变量

时间:2018-01-22 12:29:19

标签: postgresql perl plperl

我正在尝试在postgresql中的PL / perl触发器中使用环境变量(例如HOME),它似乎是空的。

在终端中运行printenv | grep HOME会返回所需的路径。

我将触发器定义为

CREATE EXTENSION IF NOT EXISTS plperlu;

CREATE OR REPLACE FUNCTION update_solved() RETURNS trigger AS $update_solved$
  elog(NOTICE, "Hello");
  elog(NOTICE, $ENV{'HOME'});

  return;
$update_solved$ LANGUAGE plperlu;

当查询激活触发器时,我得到输出

NOTICE:  Hello
NOTICE: 

我检查了脚本中包含的%ENV(使用use Data::Dumper; elog(NOTICE, Dumper(%ENV));

$VAR1 = 'LANG';
$VAR2 = 'en_US.UTF-8';
$VAR3 = 'LC_TIME';
$VAR4 = 'C';
$VAR5 = 'LC_MONETARY';
$VAR6 = 'C';
$VAR7 = 'PGSYSCONFDIR';
$VAR8 = '/etc/postgresql-common';
$VAR9 = 'PG_GRANDPARENT_PID';
$VAR10 = '513';
$VAR11 = 'PGLOCALEDIR';
$VAR12 = '/usr/share/locale';
$VAR13 = 'LC_CTYPE';
$VAR14 = 'en_US.UTF-8';
$VAR15 = 'LC_COLLATE';
$VAR16 = 'en_US.UTF-8';
$VAR17 = 'PGDATA';
$VAR18 = '/var/lib/postgresql/9.6/main';
$VAR19 = 'LC_MESSAGES';
$VAR20 = 'en_US.UTF-8';
$VAR21 = 'LC_NUMERIC';
$VAR22 = 'C';
$VAR23 = 'PWD';
$VAR24 = '/var/lib/postgresql';
$VAR25 = 'PG_OOM_ADJUST_FILE';
$VAR26 = '/proc/self/oom_score_adj';

你知道如何在终端会话中定义我需要的env变量来在PL / perl触发器中使用吗?

1 个答案:

答案 0 :(得分:0)

虽然您正确调用PL / Perl的不受信任的plperlu变体,但初始环境仍然与普通“可信”PL / Perl的受限制环境相同。

一种解决方案是运行子shell,然后初始化其环境。类似的东西:

my $home = `bash -lc "echo \$HOME"`;

你可能需要调整bash的参数来获得你想要的东西。上面的命令显式运行bash,因为我不确定你将拥有什么默认shell,并且你提到了你的.bashrc所以可能需要使用-l来确保读取它。

您还可以从系统上的任意文本文件中明确读取您想要的信息,这可能比弄乱环境变量更容易。