Как избежать рекурсии в триггере обновления, который выполняет обновление? - PullRequest
0 голосов
/ 10 февраля 2020

Мне нужно обновить vat_total_sum товаров в записи, используя триггер. Но триггер срабатывает для обновления записи и попадает в рекурсию. Как я могу избежать этого?

Код:

CREATE OR REPLACE FUNCTION vat_total_sum() RETURNS TRIGGER AS $$
BEGIN

   UPDATE goods SET vat_total_sum = NEW.vat_sum / 100 * NEW.vat_percent 
      WHERE goods_id = new.goods_id;

RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER vat_total_sum AFTER INSERT OR UPDATE ON goods
    FOR EACH ROW EXECUTE PROCEDURE vat_total_sum();

1 Ответ

2 голосов
/ 10 февраля 2020

Не используйте UPDATE, используйте триггер BEFORE и присвойте новое значение:

CREATE OR REPLACE FUNCTION vat_total_sum() RETURNS TRIGGER AS $$
BEGIN
  new.vat_total_sum := NEW.vat_sum / 100 * NEW.vat_percent; 
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER vat_total_sum 
   <b>BEFORE</b> INSERT OR UPDATE ON goods
   FOR EACH ROW EXECUTE PROCEDURE vat_total_sum();
...