2016-02-09 32 views
1

我正在寻找一种方法来执行更新后的系统命令或插入触发器。我希望postgres可以做到这一点。 这可能吗?在postgres中用触发器执行外部程序9.4

CREATE TRIGGER check_update 
AFTER UPDATE ON allowed_member_type 
FOR EACH ROW 
EXECUTE PROCEDURE check_account_update(); 

在此先感谢

+2

可能的复制的[调用命令行功能在Perl和获得输出作为字符串](http://stackoverflow.com/questions/10211410/call-command-line-function-in-perl-and-get-output -as-string) – Kenney

+0

这不是重复的。在Postgres 9.4它不工作。 –

回答

3

Disclamer:我在同一个项目安德烈亚斯弗里奇工作。

我们通过以下方式解决了这个问题。

有一个“语言” - 延伸PL/sh Procedural Language Handler for PostgreSQL由彼得Eisentraut编码,它正是我们所需要的。

你定义一个shell脚本是这样的:

CREATE or REPLACE FUNCTION test(text) RETURNS text AS ' 
#!/bin/bash 
echo Test: $1 is working 
' LANGUAGE plsh; 

这是一个触发器功能与触发器的一些有用的环境变量的例子:

CREATE or REPLACE FUNCTION TriggerTest() RETURNS trigger AS $$ 
#!/bin/bash 
#mkdir /has/triggertest/$PLSH_TG_NAME 
cd /has/triggertest 
touch PLSH_TG_NAME-$PLSH_TG_NAME 
touch PLSH_TG_WHEN-$PLSH_TG_WHEN 
touch PLSH_TG_LEVEL-$PLSH_TG_LEVEL 
touch PLSH_TG_OP-$PLSH_TG_OP 
touch PLSH_TG_TABLE_NAME-$PLSH_TG_TABLE_NAME 
touch PLSH_TG_TABLE_SCHEMA-$PLSH_TG_TABLE_SCHEMA 
touch new-$new.x 
#touch "arg-0-'$0'" 
touch "arg-1-'$1'" 
touch "arg-2-'$2'" 
touch "arg-3-'$3'" 
touch "arg-4-'$4'" 

for arg do 
    touch "Arg is '$arg'" 
done 

exit 0 
$$ LANGUAGE plsh; 

您创建一个在─插入触发器与以下SQL语句

CREATE TRIGGER tbefore BEFORE INSERT OR UPDATE OR DELETE ON ttest2 
    FOR EACH ROW EXECUTE PROCEDURE TriggerTest(new); 

我希望这可以帮助任何人其他谁正在寻找他的问题类似的解决方案。

+0

并且:通过shellscript执行'exit 1'会导致触发失败? – joop

+0

是插入失败,出现“Error:脚本状态1退出”和之前-插入触发取消插入。我没有测试任何其他类型的触发器,但我认为其他触发器是相同的。 –

+0

我试过这种方法,但'$ new'不可在触发 –