PSQL Триггер после удаления, выполненный до - PullRequest
0 голосов
/ 07 января 2020

У меня есть таблица с автоматически увеличенным идентификатором, и я создал триггер для реорганизации идентификатора при удалении кортежа. Но я не знаю почему, я получаю исключение первичного ключа при выполнении триггера, и, как я уже пробовал, это потому, что триггер выполняется перед удалением.

Вот мой код:

DROP FUNCTION IF EXISTS f_trig_deleteEvent();

CREATE OR REPLACE FUNCTION f_trig_deleteEvent() RETURNS TRIGGER as
$$
DECLARE
    nb         int;
    DECLARE ev evenement%rowType;
BEGIN
    select 1 into nb;
    FOR ev in select *
              from evenement
              where valeur_module LIKE OLD.valeur_module
                and date_seance LIKE OLD.date_seance
                and id_user LIKE OLD.id_user
                and type_seance LIKE OLD.type_seance
                and groupe LIKE OLD.groupe
              ORDER BY id_event
        LOOP
            PERFORM *
            from evenement
            where id_event = nb
              and valeur_module LIKE ev.valeur_module
              and date_seance LIKE ev.date_seance
              and id_user LIKE ev.id_user
              and type_seance LIKE ev.type_seance
              and groupe LIKE ev.groupe;
            IF NOT FOUND THEN
                UPDATE evenement
                set id_event = nb
                where valeur_module LIKE ev.valeur_module
                  and date_seance LIKE ev.date_seance
                  and id_user LIKE ev.id_user
                  and type_seance LIKE ev.type_seance
                  and groupe LIKE ev.groupe;
                RAISE NOTICE '% %', ev.id_event, nb;
            END IF;
            select nb + 1 into nb;
        end loop;
    RETURN OLD;
END
$$ language plpgsql;

DROP TRIGGER IF EXISTS trig_deleteEvent on evenement;

CREATE TRIGGER trig_deleteEvent
    AFTER DELETE
    on evenement
    FOR EACH row
EXECUTE PROCEDURE f_trig_deleteEvent();

И вот ошибка:

delete from evenement where id_event = 4;
ERROR:  duplicate key value violates unique constraint "evenement_pkey"
DETAIL:  Key (id_event, valeur_module, date_seance, id_user, type_seance, groupe)=(4, M1102, 2020-01-07, dufloh, TP, F) already exists.
CONTEXT:  SQL statement "UPDATE evenement
                set id_event = nb
                where valeur_module LIKE ev.valeur_module
                  and date_seance LIKE ev.date_seance
                  and id_user LIKE ev.id_user
                  and type_seance LIKE ev.type_seance
                  and groupe LIKE ev.groupe"
PL/pgSQL function f_trig_deleteevent() line 22 at SQL statement

И когда я комментирую инструкцию UPDATE:

delete from evenement where id_event = 4;
NOTICE:  5 4
DELETE 1

Итак, мы видим, что удаление выполняется после триггер, даже если он установлен на ПОСЛЕ УДАЛЕНИЯ.

Может кто-нибудь помочь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...