Подтвердить что ты не робот

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). Как узнать, удалена ли строка?

4b9b3361

Ответ 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.