Триггер PostgreSQL при вставке внешнего скрипта с аргументами - PullRequest
0 голосов
/ 07 сентября 2018

Я создал функцию, вызывающую внешний скрипт с аргументами:

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 Ответ

0 голосов
/ 07 сентября 2018

Как указано в руководстве

Функция триггера должна быть объявлена ​​как функция, не имеющая аргументов и возвращающая тип триггера.

Ваша функция не объявлена ​​как returns trigger и не имеет «никаких аргументов».

Вам необходимо создать функцию триггера, которая будет вызывать вашу функцию:

create function foo_trigger_func()
  <b>returns trigger</b>
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();
...