Слайд 1ТРИГГЕРЫ
БАЗЫ ДАННЫХ И СИСТЕМЫ УПРАВЛЕНИЯ БАЗАМИ ДАННЫХ
Слайд 2Триггеры
Программная единица, срабатывающая при наступлении заданного события (вставки, удаления, обновления)
Слайд 3Триггеры
Сложные проверки целостности
Автоматическая генерация первичного ключа
Аудит
Ограничение доступа
Слайд 4Типы триггеров
По времени срабатывания
BEFORE, AFTER, INSTEAD OF
По типу события
INSERT, UPDATE,
DELETE
По области действия
FOR EACH ROW, FOR STATEMENT
Слайд 5Триггеры
Для одной таблицы могут быть определены триггеры разных типов
Для одной
таблицы могут быть определены триггеры одного типа
Порядок срабатывания НЕ ОПРЕДЕЛЯЕТСЯ
Слайд 6Триггеры
В теле триггера могут вызываться
Процедуры
Функции
Операторы DML (INSERT, UPDATE, DELETE)
Слайд 7Триггеры
:NEW.имя – новое значение столбца
:OLD.имя – старое значение столбца
Слайд 8Триггеры
CREATE [OR REPLACE] TRIGGER trigger_name
timing
event1 [OR event2
OR event3]
ON object_name
[[REFERENCING OLD AS old | NEW AS new]
FOR EACH ROW
[WHEN (condition)]]
trigger_body
Слайд 9Триггеры
CREATE OR REPLACE TRIGGER tg_departments_id
BEFORE INSERT OR UPDATE ON departments
FOR
EACH ROW
BEGIN
IF :NEW.id_depart IS NULL
THEN
SELECT seq_depart.NEXTVAL
INTO : NEW.id_depart
FROM
dual
END IF;
END;
Слайд 10Триггеры
CREATE OR REPLACE TRIGGER restrict_salary
BEFORE INSERT OR UPDATE OF salary
ON employees
FOR EACH ROW
BEGIN
IF NOT (:NEW.job_id IN ('AD_PRES', 'AD_VP'))
AND :NEW.salary > 15000 THEN
RAISE_APPLICATION_ERROR (-20202,
'Employee cannot earn more than $15,000.');
END IF;
END;
Слайд 11Триггеры
CREATE OR REPLACE TRIGGER audit_emp_values
AFTER DELETE OR INSERT OR UPDATE
ON employees
FOR EACH ROW
BEGIN
INSERT INTO audit_emp(user_name, time_stamp, id,
old_last_name, new_last_name, old_title,
new_title, old_salary, new_salary)
VALUES (USER, SYSDATE, :OLD.employee_id,
:OLD.last_name, :NEW.last_name, :OLD.job_id,
:NEW.job_id, :OLD.salary, :NEW.salary);
END;
Слайд 12Триггеры
CREATE OR REPLACE TRIGGER audit_tsttrig
BEFORE INSERT OR UPDATE OR
DELETE ON tsttrig
FOR EACH ROW
DECLARE
TIP VARCHAR2(10);
BEGIN
IF
INSERTING THEN TIP := 'INSERT';
ELSIF UPDATING THEN TIP := 'UPDATE';
ELSIF DELETING THEN TIP := 'DELETE';
END IF;
INSERT INTO myaudit (MYAUDIT.POLZ, MYAUDIT.VIZM, MYAUDIT.OPER, MYAUDIT.NZAP, MYAUDIT.HIST)
VALUES (USER, SYSDATE, TIP, :new.ID, 'Old Name: '||:old.NM||' New Name: '||:new.NM);
END AUDT_TSTTRIG;
Слайд 13Мутирующие таблицы
Мутирующая таблица – это таблица, модифицируемая в данный момент
предложением UPDATE, DELETE или INSERT, или таблица, которая может потребовать
обновления в результате действия декларативного ссылочного ограничения целостности DELETE CASCADE.
Из таких таблиц нельзя выбирать данные для использования внутри триггера
Слайд 14Мутирующие таблицы
CREATE OR REPLACE TRIGGER emp_bdr BEFOR DELETE ON emp
FOR
EACH ROW
BEGIN
UPDATE emp SET mgr = NULL WHERE mgr =
:old.empno;
END;
/
DELETE emp WHERE empno = 111;
/*Возникает следующая ошибка:
ERROR at line 1:
ORA-04091:таблица SCOTT.EMP мутирует, триггер/функция может ее не увидеть
ORA-06512:в строке 2
ORA-04088:ошибка во время выполнения триггера 'SCOTT.EMP_BDR'*/
Слайд 15Триггеры
DROP TRIGGER trigger_name;
Слайд 16Ограничения на создание триггеров
Максимальный размер – 32К
Не разрешены операторы DDL
и COMMIT, ROLLBACK, SAVEPOINT
Каскадное срабатывание не более 32 триггеров
Каждый последующий
триггер видит изменения предыдущего
Избегайте рекурсивных триггеров (UPDATE из триггера UPDATE)