Ошибка при изменении таблицы - "ORA-04091: таблица изменяется, триггер/функция может не заметить это"

Ошибка возникает, если пытаюсь в таблице RegHotelRoom поменять значение Status на 1.

One error saving changes to table "REDMARK"."REGHOTELROOM":
Row 3: ORA-04098: триггер 'MARK.LOG_ERRORS' недействителен и вызвал сбой при перепроверке достоверности
ORA-04091: таблица REDMARK.REGHOTELROOM изменяется, триггер/функция может не заметить это
ORA-06512: на  "REDMARK.DROP_TABLE_AFTER_INSERT", line 2
ORA-04088: ошибка во время выполнения триггера 'REDMARK.DROP_TABLE_AFTER_INSERT'
ORA-06512: на  "REDMARK.ARHIVE", line 3
ORA-04088: ошибка во время выполнения триггера 'REDMARK.ARHIVE'

Таблица RegHotelRoom:

введите сюда описание изображения

Данные внутри таблицы:

введите сюда описание изображения

Триггер на Update:

create or replace trigger Arhive after UPDATE ON REGHOTELROOM FOR each ROW
BEGIN
    if (:new.STATUS = 1) THEN
        insert into reghotelroomarhive (ID_REGHOTELROOM, ID_NOMER,
            ID_CLIENT, DATEOFSTART, DATEOFEND) 
        values ( :old.ID_REGHOTELROOM, :old.ID_NOMER,
            :old.ID_CLIENT, :old.DATEOFSTART, :old.DATEOFEND);
    end if;
END;

Таблица RegHotelRoomArhive:

введите сюда описание изображения

Данные таблицы:

введите сюда описание изображения

Триггер на удаление записи из RegHotelRoom:

create or replace trigger DROP_TABLE_AFTER_INSERT  
    after insert ON reghotelroomarhive FOR each ROW
BEGIN
    DELETE FROM REGHOTELROOM WHERE (ID_REGHOTELROOM = :new.ID_REGHOTELROOM);
END;

Ответы (1 шт):

Автор решения: 0xdb

Изменить запись чтобы её тут же удалить, не имеет никакого смысла.

Вместо изменения просто удалите запись в таблице REGHOTELROOM. Для архивации удалённых записей можно воспользоватесь таким триггером:

create or replace trigger Arhive after delete on REGHOTELROOM FOR each ROW
begin
    insert into reghotelroomarhive (ID_REGHOTELROOM, ID_NOMER,
        ID_CLIENT, DATEOFSTART, DATEOFEND) 
    values ( :old.ID_REGHOTELROOM, :old.ID_NOMER,
        :old.ID_CLIENT, :old.DATEOFSTART, :old.DATEOFEND);
end;
→ Ссылка