Откат перехвата Postgresql при сбое функции на одной из нескольких вставок, но триггер был выполнен - PullRequest
0 голосов
/ 02 июля 2019

У меня есть функция plpgsql, которая выполняет несколько вставок в несколько таблиц. Я также триггер, который делает некоторые вещи, например, уведомляет некоторые службы.

Процесс выглядит так:

  1. Вставить в таблицу A
  2. Триггер выполнен на столе A
  3. Функция не работает вставить в таблицу B

И затем транзакция откатывается, и у меня нет данных в таблице A, но триггер выполнен. Кроме того, на столе А нет никакого УДАЛЕНИЯ.

Мой триггер и функция:

CREATE OR REPLACE FUNCTION some_function() RETURNS trigger AS
$$
BEGIN
    PERFORM pg_notify('pgchannel1', row_to_json(new)::text);
    RETURN NULL;
END
$$ LANGUAGE plpgsql;

CREATE TRIGGER some_trigger
    AFTER INSERT
    ON some_table
    FOR EACH ROW
EXECUTE PROCEDURE some_function();

Я бы хотел, чтобы этот процесс был таким:

  1. Вставить в таблицу A
  2. Вставить в таблицу B
  3. Триггер, выполняемый в таблице A / Триггер, выполняемый после выполнения функции

Как я могу отловить, что транзакция откатилась и не выполняет триггер? Есть ли способ вызвать состояние функции?

1 Ответ

1 голос
/ 02 июля 2019

Да, вы можете сделать это с помощью триггеров ограничения :

CREATE CONSTRAINT TRIGGER some_trigger
   AFTER INSERT ON some_table
   DEFERRABLE INITIALLY DEFERRED FOR EACH ROW
EXECUTE PROCEDURE some_function();

Такой триггер сработает в конце транзакции, а не сразу.

...