Я создал триггер, чтобы вызвать ошибку, если в удаленной строке есть поле datefin, которое не превышало год - PullRequest
0 голосов
/ 15 января 2019

Вот мой код:

create or replace trigger tr_interdit
before delete on reservation
for each row
DECLARE
    V_res_date RESERVATION.DATEFIN%type;
begin
    SELECT DATEFIN into V_res_date
    FROM reservation
    where DATEFIN = :old.DATEFIN;

    if V_res_date<add_months(V_res_date,-12)
        then RAISE_APPLICATION_ERROR(-20001, 'Date fin na pas depasse un ans');
    end if;

end tr_interdit;
/

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

Вот ошибка:

УДАЛИТЬ ИЗ "ДАНИЭЛЯ". "БРОНИРОВАНИЕ" ГДЕ ROWID = 'AAAFCvAABAAALHhAAA' AND ORA_ROWSCN = '3392006' и ("NUMR" равно нулю или "NUMR" не равно нулю ) ORA-04091: таблица DANIEL.RESERVATION мутирует, триггер / функция может не видеть его ORA-06512: в "DANIEL.TR_INTERDIT", строка 4 ORA-04088: ошибка во время выполнения триггера 'DANIEL.TR_INTERDIT'

1 Ответ

0 голосов
/ 15 января 2019

Нет необходимости в SELECT, просто получить доступ к старому значению напрямую.

Ваше состояние v_res_date < add_months(v_res_date,-12) никогда не будет верным.

Полагаю, вы не хотите использовать v_res_date в вызове add_months(), но сравните значение :old.DATEFIN с "текущей датой" - sysdate

create or replace trigger tr_interdit
before delete on reservation
for each row
begin
    if :old.DATEFIN < add_months(sysdate,-12)
        then RAISE_APPLICATION_ERROR(-20001, 'Date fin na pas depasse un ans');
    end if;

end tr_interdit;
/
...