gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:24:25 26 4
gpt4 key购买 nike

我试图在 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(注意, 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';

你知道我如何设置在终端 session 中定义的我需要的环境变量,以便在 PL/perl 触发器中使用吗?

最佳答案

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

一个解决方案是运行一个子 shell,然后它会初始化它的环境。像这样的东西:

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

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

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

关于postgresql - PL/Perl 触发器不能使用 .bashrc 中定义的 ENV 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48381663/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com