微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我不确定这个问题是否具体,但是我在创build一个运行Linux shell命令的Postgres函数时遇到了困难,这个函数一个细节:在插入之后,它是Trigger中的一个函数,我需要使用一些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的参数的NEWvariables,所以在args[]我得到的是"NEW.uniqueid" , "NEW.linkedid"和"NEW.eventtype" 。

低级别的胡克

dynamic库调用函数

Linux shell脚本:在函数中使用别名

在shell中执行之前检查一个函数是否存在

如何创build一个cron作业来运行postgres sql函数

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

如何在Awk单行/单命令中包含简短函数

函数存储在unixvariables中

一个进程的信号如何影响其子线程?

c – 中断正在线程中执行的函数调用

C如何显示所有未使用的函数包括h文件中定义的函数

你可以在plsh触发器中访问一些值。

更新只提供老

INSERT只提供NEW(duh)

删除我没有测试

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

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

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变量。

据我所知,你不能访问PL / sh中的NEW和OLD元组

我会用PL / Perl或PL / 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();

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐