В этом учебном пособии вы узнаете, как создать триггер BEFORE DELETE (перед удалением) в Oracle с синтаксисом и примерами.
Описание
Oracle исполняет (возбуждает) триггер BEFORE DELETE до выполнения оператора DELETE.
Синтаксис
CREATE [ OR REPLACE ] TRIGGER имя_триггера
BEFORE DELETE
ON имя_таблицы
[ FOR EACH ROW ]
DECLARE
-- декларирование переменных
BEGIN
-- код триггера
EXCEPTION
WHEN ...
-- обработка исключительной ситуации
END;
BEFORE DELETE
ON имя_таблицы
[ FOR EACH ROW ]
DECLARE
-- декларирование переменных
BEGIN
-- код триггера
EXCEPTION
WHEN ...
-- обработка исключительной ситуации
END;
Параметры или аргументы
имя_триггера наименование создаваемого триггера.
BEFORE DELETE указывает, что триггер срабатывает до выполнения оператора DELETE.
имя_таблицы наименование таблицы для которой триггер был создан.
Ограничения
- Вы не можете создавать триггер в представлениях (view).
- Вы не можете обновить :NEW (новые) значения.
- Вы не можете обновить :OLD (старые) значения.
Примечание
- Смотрите также: как создать триггеры AFTER DELETE, AFTER INSERT, AFTER UPDATE, BEFORE INSERT, и BEFORE UPDATE.
- Смотрите также: как удалить триггер.
Пример
Рассмотрим на примере, как создать триггер BEFORE DELETE, используя конструкцию CREATE TRIGGER.
Если вы создали таблицу следующей структуры:
CREATE TABLE orders
( order_id number(5),
quantity number(4),
cost_per_item number(6,2),
total_cost number(8,2)
);
( order_id number(5),
quantity number(4),
cost_per_item number(6,2),
total_cost number(8,2)
);
Тогда мы создадим триггер BEFORE DELETE следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
CREATE OR REPLACE TRIGGER orders_before_delete BEFORE DELETE ON orders FOR EACH ROW DECLARE v_username varchar2(10); BEGIN -- Найти персону username, осуществляющего DELETE в таблице SELECT user INTO v_username FROM dual; -- Вставить строку в таблицу audit INSERT INTO orders_audit ( order_id, quantity, cost_per_item, total_cost, delete_date, deleted_by ) VALUES ( :old.order_id, :old.quantity, :old.cost_per_item, :old.total_cost, sysdate, v_username ); END; |