Oracle и ТРИГГЕРЫ (вставленный, обновленный, удаленный)

Я хотел бы использовать триггер на таблице, которая будет запущена каждый раз, когда строка вставлена, обновлена или удалена.

Я записал что-то вроде этого:

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

24
задан LeftyX 15 April 2015 в 08:20
поделиться

4 ответа

Из Использование триггеров:

Обнаружение операции DML, которая вызвала триггера

Если более одного типа операций DML может вызвать триггер (например, ON ВСТАВКА, УДАЛЕНИЕ ИЛИ ОБНОВЛЕНИЕ Emp_tab), в теле триггера можно использовать условные предикаты INSERTING, DELETING и UPDATING для проверки того, какой тип оператора запускает триггер.

Так

IF DELETING THEN ... END IF;

должно работать в вашем случае.

38
ответ дан 28 November 2019 в 22:33
поделиться

Я изменил свой код вот так, и он работает:

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;
24
ответ дан 28 November 2019 в 22:33
поделиться

Разделите его на 2 триггера. Один для удаления и один для вставки \ обновления.

1
ответ дан 28 November 2019 в 22:33
поделиться

Значения 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' на что-то другое.

5
ответ дан 28 November 2019 в 22:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: