Триггер PostgreSQL при вставке внешнего скрипта с аргументами
Я создал функцию вызова внешнего скрипта с аргументами:
CREATE OR REPLACE FUNCTION foo3(text, text) RETURNS TEXT AS $$
$ip = shift;
$username = shift;
$cmd="/bin/echo -n $ip $username > /tmp/test";
return `$cmd`;
$$ LANGUAGE plperlu;
Работает нормально при выполнении вручную. Но я хотел вызывать его каждый раз, когда в мою таблицу вставляется новая запись (передаваемые аргументы, которые являются значениями записи):
postgres=# CREATE TRIGGER t_foo
postgres-# BEFORE UPDATE
postgres-# ON mapping
postgres-# FOR EACH ROW
postgres-# EXECUTE PROCEDURE foo3(OLD.ip, OLD.username);
ERROR: syntax error at or near "."
LINE 5: EXECUTE PROCEDURE foo3(OLD.ip, OLD.username);
^
Ясно, что я не могу передать аргументы этой функции. Как это исправить?
1 ответ
Решение
Функция триггера должна быть объявлена как функция, не имеющая аргументов и возвращающая тип триггера.
Ваша функция не объявлена как returns trigger
и при этом у него нет "никаких аргументов".
Вам нужно создать триггерную функцию, которая вызывает вашу функцию:
create function foo_trigger_func()
returns trigger
as
$$
begin
perform foo3(old.ip, old.username);
end;
$$
language plpgsql;
Затем вы создаете триггер, используя эту функцию:
CREATE TRIGGER t_foo
BEFORE UPDATE ON mapping
FOR EACH ROW
EXECUTE PROCEDURE foo_trigger_func();