Я хотел бы использовать триггер на таблице, которая будет запущена каждый раз, когда строка вставлена, обновлена или удалена.
Я записал что-то вроде этого:
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). Как я могу знать, была ли строка удалена?
Обнаружение операции DML, которая вызвала триггера
Если более одного типа операций DML может вызвать триггер (например, ON ВСТАВКА, УДАЛЕНИЕ ИЛИ ОБНОВЛЕНИЕ Emp_tab), в теле триггера можно использовать условные предикаты INSERTING, DELETING и UPDATING для проверки того, какой тип оператора запускает триггер.
Так
IF DELETING THEN ... END IF;
должно работать в вашем случае.
Я изменил свой код вот так, и он работает:
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;
Разделите его на 2 триггера. Один для удаления и один для вставки \ обновления.
Значения NEW (или NEW_BUFFER, как вы их переименовали) доступны только при ВСТАВКЕ и ОБНОВЛЕНИИ. Для УДАЛЕНИЯ вам нужно будет использовать СТАРЫЙ (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')
Вам может потребоваться добавить логику внутри триггера для обслуживания кода, который обновляет field1 с 'HBP000' на что-то другое.