Я до сих пор не знал функцию generate_series ().Спасибо, что указал мне в этом направлении.
Чтобы все работало так, как я задумал, мне нужно использовать generate_series () внутри функции Trigger, которая запускается ПОСЛЕ INSERT.После первых проблем с рекурсивными вставками триггера У меня теперь проблема в том, что мой триггер выдает много дублирующих вставок (увеличивается с выбранной периодичностью).
Мои действия с таблицей выглядят так:
id serial not null
id_action integer
action_year integer
periodicity integer
from_ integer
to_ integer
Мой триггер на столе:
CREATE TRIGGER tr_actions_recurrent
AFTER INSERT
ON actions
FOR EACH ROW
WHEN ((pg_trigger_depth() = 0))
EXECUTE PROCEDURE actions_recurrent();
Вот моя функция триггера:
CREATE OR REPLACE FUNCTION actions_recurrent()
RETURNS trigger AS
$BODY$
BEGIN
IF NEW.periodicity >0 AND NEW.action_year <= NEW.to_-NEW.periodicity THEN
INSERT into actions(id_action, action_year,periodicity, from_, to_)
SELECT NEW.id_action, y, NEW.periodicity, NEW.from_, NEW.to_
FROM actions, generate_series(NEW.from_+NEW.periodicity,NEW.to_,NEW.periodicity) AS y;
END IF;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
Когда я делаю вставку
INSERT INTO actions (id_action, action_year,periodicity,from_, to_)
VALUES (50,2018,4,2018,2028);
Я получаю одну строку для action_year 2018, но 13 строк 2022 и 2026 ??В моем понимании, предложение IF в триггер-функции должно избегать такого повторного выполнения.