我不确定我是否具体在问题中,但是我在创建运行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
。
答案 0 :(得分:3)
您可以在plsh触发器中访问某些值。
所以你使用参数获得这些值,比如$ 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中的NEW
和OLD
元组。
这是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();