Превышен предел глубины стека PostgreSQL триггер вставки - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь создать простой триггер, который вставляет строку в таблицу друзей с инвертированными значениями, поэтому, когда (1,2) вставляется (2,1), также вставляется, но я продолжаю получать эту ошибку, и я Я не уверен, что происходит не так.

ОШИБКА: превышен предел глубины стека. СОВЕТ: Увеличьте параметр конфигурации "max_stack_depth" (в настоящее время 2048 КБ) после того, как убедитесь, что ограничение глубины стека платформы соответствует. КОНТЕКСТ: SQL оператор «вставить в значения друзей (ID1, ID2) (NEW.ID2, NEW.ID1)» PL / pg SQL функция friend_add () строка 2 в SQL оператор

CREATE OR REPLACE FUNCTION public.friend_add()
RETURNS trigger
LANGUAGE 'plpgsql'
VOLATILE
COST 100
AS $BODY$begin
insert into friend(ID1,ID2) values (NEW.ID2, NEW.ID1);
return new;
end
end;$BODY$;

CREATE TRIGGER friend_add
    AFTER INSERT
    ON public.friend
    FOR EACH ROW
    EXECUTE PROCEDURE public.friend_add();

Вот мои определения функций и триггеров.

1 Ответ

1 голос
/ 14 апреля 2020

Это бесконечное l oop: вы вставляете ID1-ID2, затем триггер вставляет ID2-ID1, который перехватывается триггером, который снова вставляет ID1-ID2 и т. Д. c.

Вы нужно сделать вставку только один раз. Самым простым (и, вероятно, самым безопасным) будет иметь уникальное ограничение на ID1-ID2 и выполнить upsert:

insert into friend(ID1,ID2) values (NEW.ID2, NEW.ID1) ON CONFLICT (ID1,ID2) DO NOTHING;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...