@furyon

Как создать UPDATE триггер без рекурсии в Postgres?

Здравствуйте!

В общем процедура и триггер
CREATE FUNCTION advs__up_is_paid_mode() RETURNS TRIGGER
AS $$
BEGIN
	IF NEW.balance<NEW.amount THEN
		UPDATE advs SET is_paid_mode=0 WHERE id=NEW.id;
	ELSE
		UPDATE advs SET is_paid_mode=1 WHERE id=NEW.id;
	END IF;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER advs__up_is_paid_mode__trigger
AFTER INSERT OR UPDATE
ON advs
FOR EACH ROW
EXECUTE PROCEDURE advs__up_is_paid_mode();

В двух словах что здесь происходит:
При каждом обновлении проверяется если balance<amount то is_paid_mode=0 иначе 1.

Но при апдейте получаю ошибку про stack depth limit exceeded. Подозреваю что эта процедура впадает в рекурсию.
Как быть? Спасибо.
  • Вопрос задан
  • 375 просмотров
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
id - это primary key? Т.е. изменять надо именно эту самую строку? Тогда before insert or update и меняется сам NEW:
IF NEW.balance<NEW.amount THEN
    NEW.is_paid_mode=0;
  ELSE
    NEW.is_paid_mode=1;
  END IF;
RETURN NEW;
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы