ОРАКУЛ и ТРИГГЕРЫ (вставлены, обновлены, удалены) - PullRequest
23 голосов
/ 03 июня 2010

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

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

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

Ответы [ 4 ]

37 голосов
/ 03 июня 2010

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

Обнаружение запущенной операции DML Триггер

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

So

IF DELETING THEN ... END IF;

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

22 голосов
/ 03 июня 2010

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

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;
4 голосов
/ 03 июня 2010

Новые значения (или NEW_BUFFER, как вы их переименовали) доступны только при INSERTING и UPDATING. Для УДАЛЕНИЯ вам необходимо использовать 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') 

Вам может понадобиться добавить логику внутри триггера, чтобы обслуживать код, который обновляет field1 с HBP000 на что-то другое.

1 голос
/ 03 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...