我正在寻找一种方法来执行更新后的系统命令或插入触发器。我希望postgres可以做到这一点。 这可能吗?在postgres中用触发器执行外部程序9.4
CREATE TRIGGER check_update
AFTER UPDATE ON allowed_member_type
FOR EACH ROW
EXECUTE PROCEDURE check_account_update();
在此先感谢
我正在寻找一种方法来执行更新后的系统命令或插入触发器。我希望postgres可以做到这一点。 这可能吗?在postgres中用触发器执行外部程序9.4
CREATE TRIGGER check_update
AFTER UPDATE ON allowed_member_type
FOR EACH ROW
EXECUTE PROCEDURE check_account_update();
在此先感谢
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);
我希望这可以帮助任何人其他谁正在寻找他的问题类似的解决方案。
并且:通过shellscript执行'exit 1'会导致触发失败? – joop
是插入失败,出现“Error:脚本状态1退出”和之前-插入触发取消插入。我没有测试任何其他类型的触发器,但我认为其他触发器是相同的。 –
我试过这种方法,但'$ new'不可在触发 –
可能的复制的[调用命令行功能在Perl和获得输出作为字符串](http://stackoverflow.com/questions/10211410/call-command-line-function-in-perl-and-get-output -as-string) – Kenney
这不是重复的。在Postgres 9.4它不工作。 –