2016-02-09 3 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

Юридическая информация: Я работаю с Андреасом Фрича на том же проекте.

Мы решили эту проблему следующим образом.

Существует «Язык» -расширение PL/sh Procedural Language Handler for PostgreSQL, закодированное Peter Eisentraut, которое делает именно то, что нам нужно.

Вы определяете оболочку-скрипт так:

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; 

Вы создаете перед- insert-trigger со следующим SQL-заявлением

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

Я надеюсь, что это поможет кому-либо другой, кто ищет аналогичное решение для своей проблемы.

+0

И: выполняет ли «exit 1» в shellscript, чтобы триггер завершился с ошибкой? – joop

+0

Да, вставка терпит неудачу с «ERROR: сценарий, выходящий со статусом 1», и триггер before-insert-cs отменяет вставку. Я не тестировал какой-либо другой триггер, но я предполагаю, что остальные триггеры одинаковы. –

+0

Я пробовал этот подход, но '$ new' недоступен в триггере. –

Смежные вопросы