@TemaKam

Откуда появляется бесконечный цикл?

функция триггера
CREATE OR REPLACE FUNCTION delete_abonent() RETURNS TRIGGER AS $$ BEGIN
IF OLD.bilet_number IN (SELECT bilet_number FROM all_lends) THEN
RAISE EXCEPTION 'У этого абонента есть выданные книги!'; RETURN NULL; END IF;
DELETE FROM all_users WHERE user_login = OLD.user_login;
EXECUTE format('DROP USER %I', OLD.user_login);
DELETE FROM all_abonents WHERE bilet_number = OLD.bilet_number;
END; $$ LANGUAGE plpgsql;

триггер
CREATE TRIGGER before_delete_abonent INSTEAD OF DELETE ON all_abonents
FOR EACH ROW EXECUTE PROCEDURE delete_abonent();

пытаюсь удалить запись, вызвав триггер, но почему-то пишет, что роли не существует, хотя она есть
как это понять?
IaKXGrt.jpg
P.S.
с условием drop user IF EXISTS функция уходит в бесконечный цикл
полагаю без условия при первом проходе удаляется, а потом вот эта ошибка
но откуда тут цикл?
P.P.S.
проблема не в удалении роли, а как раз в этом цикле, т.е. даже без команды удаления роли не работает
PnCy0QR.jpg
что-то с этим оператором не так, не пойму что
DELETE FROM all_abonents WHERE bilet_number = OLD.bilet_number;
  • Вопрос задан
  • 175 просмотров
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
Давайте вы лучше расскажете почему вы считаете, что здесь рекурсии нет.

Вы делаете
INSTEAD OF DELETE ON all_abonents

и в этом триггере DELETE FROM all_abonents WHERE - почему же это не должно уходить в бесконечную рекурсию?

Чем налагать спорные ограничения на действия из триггеров, postgresql будет послушно выполнять рекурсивные вызовы до исчерпания стека, а предоставлять условия выхода из рекурсии - задача разработчика.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@galaxy
Почему рекурсия, понятно - вы вызываете DELETE в INSTEAD OF триггере на DELETE.

Другой вопрос, что вы хотите сделать. Если вы при успешной проверке
IF OLD.bilet_number IN (SELECT bilet_number FROM all_lends)
хотите удалить этого абонента (и только его), то нужно было делать обычный не INSTEAD) триггер и вместо DELETE оператора в конце сделать RETURN OLD.
Ответ написан
Ваш ответ на вопрос

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

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