在PostgreSQL函数中使用参数运行系统命令

时间:2017-04-04 11:13:03

标签: linux database postgresql function triggers

我不确定我是否具体在问题中,但是我在创建运行Linux shell命令的Postgres函数时遇到了问题,其中一个细节是:它是触发器中的一个功能插入后我需要使用一些NEW列。

在MySQL中,使用插件" MySQL UDF"这很简单,触发器就像这样:

BEGIN
 DECLARE result int(10);
 SET result = sys_exec('/usr/bin/php /var/www/html/.../regras.php NEW.uniqueid NEW.linkedid NEW.eventtype');
END

但是在PostgreSQL上我尝试了PL / sh语言,它可以运行任何shell脚本,所以我编写了以下函数:

   CREATE FUNCTION tarifador_func2() RETURNS TRIGGER
    LANGUAGE plsh
    AS $$
    #!/bin/sh
    /usr/bin/php /var/www/html/...regras.php NEW.uniqueid NEW.linkedid NEW.eventtype
   $$;

它以正确的方式执行.php文件,问题是语言无法识别我作为PHP的参数提供的NEW变量,所以在args[]什么我得到的是"NEW.uniqueid""NEW.linkedid""NEW.eventtype"

所以,任何人都知道如何在PL / sh中正确使用NEW参数? 另一种可能的解决方案可能是通过创建触发器的参数手动设置我需要的三个值,但不允许在参数中使用NEW

2 个答案:

答案 0 :(得分:3)

您可以在plsh触发器中访问某些值。

  • UPDATE仅提供OLD
  • INSERT仅提供NEW(duh)
  • 删除我没有测试

所以你使用参数获得这些值,比如$ 1,$ 2

你的功能看起来有点像这样:

npm rebuild --runtime=electron --target=1.3.1 --disturl=atom.io/download/atom-shell --build-from-source

$$;

请注意,我没有使用CREATE FUNCTION tarifador_func2() RETURNS TRIGGER LANGUAGE plsh AS $$ #!/bin/sh /usr/bin/php /var/www/html/...regras.php $3 $6 $1 ,这是因为$1 $2 $3扩展名将所有列转储到参数中,以便在表中声明它们。因此,您可以执行plsh之类的操作,它会位于INSERT INTO table1 (column3) VALUES (6);中的$3下,假设这是表格中的第三列。

作为旁注,触发器的元数据可通过env vars获得。

答案 1 :(得分:1)

据我所知,您无法访问PL / sh中的NEWOLD元组。

我会为此目的使用PL/PerlPL/Python

这是PL / Python中的一个例子:

CREATE OR REPLACE FUNCTION pytrig() RETURNS trigger
   LANGUAGE plpythonu AS
$$import os
os.system("/usr/bin/php /home/laurenz/hello.php '" + TD["new"]["val"] + "'")$$;

CREATE TABLE test (id integer PRIMARY KEY, val text);

CREATE TRIGGER pytrig AFTER INSERT ON test FOR EACH ROW
   EXECUTE PROCEDURE pytrig();