ORACLE и TRIGGERS (вставлены, обновлены, удалены)
Я хотел бы использовать триггер в таблице, который будет запускаться каждый раз, когда строка будет вставлена, обновлена или удалена.
Я написал что-то вроде этого:
CREATE or REPLACE TRIGGER test001
AFTER INSERT OR DELETE OR UPDATE ON tabletest001
REFERENCING OLD AS old_buffer NEW AS new_buffer
FOR EACH ROW WHEN (new_buffer.field1 = 'HBP00')
и он работает.
Поскольку я хотел бы делать то же самое, если строка вставлена, обновлена или удалена, я хотел бы знать, что происходит в триггере.
Я думаю, мне удастся найти, вставлена или обновлена строка (я могу проверить old_buffer с new_buffer).
Как узнать, удалена ли строка?
Ответы
Ответ 1
Из Использование триггеров:
Обнаружение операции DML, которая была запущена триггер
Если используется более одного типа операции DML может запускать триггер (например, ON ВСТАВИТЬ ИЛИ УДАЛИТЬ ИЛИ ОБНОВИТЬ Emp_tab), тело триггера может использовать условные предикаты INSERTING, УДАЛЕНИЕ и ОБНОВЛЕНИЕ, чтобы проверить, тип оператора запускает триггер.
Итак,
IF DELETING THEN ... END IF;
должен работать для вашего дела.
Ответ 2
Я изменил свой код следующим образом:
CREATE or REPLACE TRIGGER test001
AFTER INSERT OR UPDATE OR DELETE ON tabletest001
REFERENCING OLD AS old_buffer NEW AS new_buffer
FOR EACH ROW WHEN (new_buffer.field1 = 'HBP00' OR old_buffer.field1 = 'HBP00')
DECLARE
Operation NUMBER;
CustomerCode CHAR(10 BYTE);
BEGIN
IF DELETING THEN
Operation := 3;
CustomerCode := :old_buffer.field1;
END IF;
IF INSERTING THEN
Operation := 1;
CustomerCode := :new_buffer.field1;
END IF;
IF UPDATING THEN
Operation := 2;
CustomerCode := :new_buffer.field1;
END IF;
// DO SOMETHING ...
EXCEPTION
WHEN OTHERS THEN ErrorCode := SQLCODE;
END;
Ответ 3
НОВЫЕ значения (или NEW_BUFFER по мере их переименования) доступны только при вставке и обновлении. Для DELETING вам необходимо использовать OLD (OLD_BUFFER). Таким образом, ваш триггер станет следующим:
CREATE or REPLACE TRIGGER test001
AFTER INSERT OR DELETE OR UPDATE ON tabletest001
REFERENCING OLD AS old_buffer NEW AS new_buffer
FOR EACH ROW WHEN (new_buffer.field1 = 'HBP00' OR old_buffer.field1 = 'HBP00')
Возможно, вам понадобится добавить логику внутри триггера, чтобы обслуживать код, который обновляет поле1 от "HBP000" до чего-то еще.
Ответ 4
Отделите его на два триггера. Один для удаления и один для вставки\update.