Re: Trigger function

Поиск
Список
Период
Сортировка
От David G. Johnston
Тема Re: Trigger function
Дата
Msg-id CAKFQuwazmQBDYdt+zcw2WV+3bONRjbe7qoHiMnREYj+VRXEXjA@mail.gmail.com
обсуждение исходный текст
Ответ на Re: Trigger function  ("Nicolas Mitchell" <mitchelln@posteo.net>)
Ответы Re: Trigger function
Re: Trigger function
Список pgsql-novice
On Tuesday, July 27, 2021, Nicolas Mitchell <mitchelln@posteo.net> wrote:

But when I have tried this with the following trigger/function (BEFORE/AFTER), PG goes into a loop. The two associated sequences (object, host) are incremented until I break the execution but no insert happens in either table. My code is causing an endless loop. I’m too green to understand why! I’d be grateful for any hints to help me on my way.

CREATE OR REPLACE FUNCTION public.func__host__bi()
RETURNS trigger AS
$$
begin
  
INSERT INTO host (name, domain, object)
VALUES (NEW.name, NEW.domain, (SELECT * FROM object_id));
RETURN NEW;
end
$$
LANGUAGE 'plpgsql'

CREATE TRIGGER trig__host_bi
  BEFORE INSERT <————————————> or AFTER INSERT
  ON public."host"
  FOR EACH ROW
  EXECUTE PROCEDURE public.func__host__bi();

You are getting an infinite cycle because while in the middle of inserting a row into host, which provokes the trigger, you go and execute another insert command for host, provoking the same trigger, performing yet another insert, provoking the same trigger, etc…

When you write a trigger for a table you should be executing commands against the same table.

You change the data in the ongoing insert by returning a different row from the trigger function (i.e., modify your “return new;” line - or modify NEW itself?).

David J.

В списке pgsql-novice по дате отправления:

Предыдущее
От: "Nicolas Mitchell"
Дата:
Сообщение: Re: Trigger function
Следующее
От: "David G. Johnston"
Дата:
Сообщение: Re: Trigger function