Что такое триггер в PL / SQL?
ТРИГГЕРЫ - это сохраненные программы, которые автоматически запускаются механизмом Oracle, когда в таблице выполняются такие операторы DML, как вставка, обновление, удаление или происходят некоторые события. Код, который должен выполняться в случае срабатывания триггера, может быть определен в соответствии с требованиями. Вы можете выбрать событие, при котором должен срабатывать триггер, и время выполнения. Цель триггера - поддерживать целостность информации в базе данных.
В этом руководстве вы узнаете:
- Преимущества триггеров
- Типы триггеров в Oracle
- Как создать триггер
- : NEW и: OLD Пункт
- ВМЕСТО триггера
- Составной триггер
Преимущества триггеров
Ниже приведены преимущества триггеров.
- Автоматическое создание некоторых производных значений столбцов
- Обеспечение ссылочной целостности
- Регистрация событий и хранение информации о доступе к таблицам
- Аудиторская проверка
- Синхронная репликация таблиц
- Введение авторизации безопасности
- Предотвращение недействительных транзакций
Типы триггеров в Oracle
Триггеры можно классифицировать по следующим параметрам.
- Классификация по срокам
- BEFORE Trigger: срабатывает до того, как произошло указанное событие.
- ПОСЛЕ триггера: срабатывает после того, как произошло указанное событие.
- ВМЕСТО триггера: особый тип. Вы узнаете больше о дальнейших темах. (только для DML)
- Классификация по уровню
- Триггер уровня STATEMENT: срабатывает один раз для указанного оператора события.
- Триггер уровня ROW: он срабатывает для каждой записи, на которую повлияло указанное событие. (только для DML)
- Классификация по событию
- Триггер DML: срабатывает, когда указано событие DML (INSERT / UPDATE / DELETE)
- Триггер DDL: срабатывает, когда указано событие DDL (CREATE / ALTER)
- Триггер DATABASE: срабатывает, когда указано событие базы данных (LOGON / LOGOFF / STARTUP / SHUTDOWN)
Таким образом, каждый триггер представляет собой комбинацию вышеуказанных параметров.
Как создать триггер
Ниже приведен синтаксис для создания триггера.
CREATE [ OR REPLACE ] TRIGGER[BEFORE | AFTER | INSTEAD OF ][INSERT | UPDATE | DELETE… ]ON [FOR EACH ROW][WHEN ]DECLARE BEGIN EXCEPTION END;
Объяснение синтаксиса:
- Приведенный выше синтаксис показывает различные необязательные операторы, которые присутствуют при создании триггера.
- BEFORE / AFTER укажет время события.
- ВСТАВИТЬ / ОБНОВЛЕНИЕ / ВХОД / СОЗДАТЬ / и т. Д. будет указывать событие, для которого необходимо активировать триггер.
- Предложение ON указывает, на каком объекте действует упомянутое выше событие. Например, это будет имя таблицы, в которой может произойти событие DML в случае триггера DML.
- Команда «ДЛЯ КАЖДОЙ СТРОКИ» задает триггер уровня СТРОКИ.
- Предложение WHEN определяет дополнительное условие, при котором триггер должен срабатывать.
- Часть объявления, часть выполнения, часть обработки исключений такая же, как и у других блоков PL / SQL. Часть объявления и часть обработки исключений не являются обязательными.
: NEW и: OLD Пункт
В триггере уровня строки триггер срабатывает для каждой связанной строки. Иногда требуется знать значение до и после оператора DML.
Oracle предоставила два предложения в триггере уровня RECORD для хранения этих значений. Мы можем использовать эти предложения для ссылки на старые и новые значения внутри тела триггера.
- : NEW - содержит новое значение для столбцов базовой таблицы / представления во время выполнения триггера.
- : OLD - содержит старое значение столбцов базовой таблицы / представления во время выполнения триггера.
Это предложение следует использовать на основе события DML. В таблице ниже будет указано, какое предложение действительно для какого оператора DML (INSERT / UPDATE / DELETE).
ВСТАВЛЯТЬ | ОБНОВИТЬ | УДАЛИТЬ | |
:НОВЫЙ | ДЕЙСТВИТЕЛЬНЫЙ | ДЕЙСТВИТЕЛЬНЫЙ | ИНВАЛИД. В случае удаления нет нового значения. |
:СТАРЫЙ | ИНВАЛИД. В регистре вставки нет старого значения | ДЕЙСТВИТЕЛЬНЫЙ | ДЕЙСТВИТЕЛЬНЫЙ |
ВМЕСТО триггера
«ВМЕСТО триггера» - это особый тип триггера. Используется только в триггерах DML. Он используется, когда на сложном представлении должно произойти какое-либо событие DML.
Рассмотрим пример, в котором представление состоит из трех базовых таблиц. Когда какое-либо событие DML выдается в этом представлении, оно становится недействительным, поскольку данные берутся из 3 разных таблиц. Таким образом, в данном случае используется триггер INSTEAD OF. Триггер INSTEAD OF используется для непосредственного изменения базовых таблиц вместо изменения представления для данного события.
Пример 1 : В этом примере мы собираемся создать сложное представление из двух базовых таблиц.
- Table_1 - это таблица emp и
- Таблица_2 - таблица отдела.
Затем мы увидим, как триггер INSTEAD OF используется для выполнения UPDATE оператора подробностей местоположения в этом сложном представлении. Мы также увидим, как: NEW и: OLD полезны в триггерах.
- Шаг 1. Создание таблиц emp и dept с соответствующими столбцами.
- Шаг 2. Заполнение таблицы примерными значениями
- Шаг 3: Создание представления для созданной выше таблицы
- Шаг 4. Обновление представления перед триггером вместо
- Шаг 5: Создание триггера вместо
- Шаг 6. Обновление вида после триггера вместо триггера
Шаг 1) Создание таблицы emp и dept с соответствующими столбцами
CREATE TABLE emp(emp_no NUMBER,emp_name VARCHAR2(50),salary NUMBER,manager VARCHAR2(50),dept_no NUMBER);/CREATE TABLE dept(Dept_no NUMBER,Dept_name VARCHAR2(50),LOCATION VARCHAR2(50));/
Код Пояснение
- Строка кода 1-7 : создание таблицы emp.
- Строка кода 8-12 : Создание таблицы "dept".
Выход
Таблица создана
Шаг 2) Теперь, когда мы создали таблицу, мы заполним эту таблицу примерными значениями и созданием представлений для вышеуказанных таблиц.
BEGININSERT INTO DEPT VALUES(10,‘HR’,‘USA’);INSERT INTO DEPT VALUES(20,'SALES','UK’);INSERT INTO DEPT VALUES(30,‘FINANCIAL',‘JAPAN');COMMIT;END;/BEGININSERT INTO EMP VALUES(1000,'XXX5,15000,'AAA',30);INSERT INTO EMP VALUES(1001,‘YYY5,18000,‘AAA’,20) ;INSERT INTO EMP VALUES(1002,‘ZZZ5,20000,‘AAA',10);COMMIT;END;/
Код Пояснение
- Строка кода 13-19 : Вставка данных в таблицу dept.
- Строка кода 20-26: Вставка данных в таблицу emp.
Выход
Процедура PL / SQL завершена
Шаг 3) Создание представления для созданной выше таблицы.
CREATE VIEW guru99_emp_view(Employee_name:dept_name,location) ASSELECT emp.emp_name,dept.dept_name,dept.locationFROM emp,deptWHERE emp.dept_no=dept.dept_no;/
SELECT * FROM guru99_emp_view;
Код Пояснение
- Строка кода 27-32: Создание представления guru99_emp_view.
- Строка кода 33: Запрос guru99_emp_view.
Выход
Просмотр создан
ИМЯ СОТРУДНИКА | DEPT_NAME | МЕСТО РАСПОЛОЖЕНИЯ |
ZZZ | HR | Соединенные Штаты Америки |
ГГГ | ПРОДАЖИ | Великобритания |
XXX | ФИНАНСОВЫЕ | ЯПОНИЯ |
Шаг 4) Обновление вида до, а не триггера.
BEGINUPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name=:'XXX’;COMMIT;END;/
Код Пояснение
- Строка кода 34–38: Обновите местоположение «XXX» на «FRANCE». Это вызвало исключение, потому что операторы DML не разрешены в сложном представлении.
Выход
ORA-01779: невозможно изменить столбец, который сопоставляется с таблицей без сохранения ключей
ORA-06512: в строке 2
Шаг 5) Чтобы избежать появления ошибки во время обновления представления на предыдущем шаге, на этом шаге мы будем использовать «вместо триггера».
CREATE TRIGGER guru99_view_modify_trgINSTEAD OF UPDATEON guru99_emp_viewFOR EACH ROWBEGINUPDATE deptSET location=:new.locationWHERE dept_name=:old.dept_name;END;/
Код Пояснение
- Строка кода 39: Создание триггера INSTEAD OF для события «UPDATE» в представлении «guru99_emp_view» на уровне ROW. Он содержит оператор обновления для обновления местоположения в базовой таблице dept.
- Строка кода 44: Оператор обновления использует ': NEW' и ': OLD' для поиска значений столбцов до и после обновления.
Выход
Триггер создан
Шаг 6) Обновление вида после триггера. Теперь ошибка не возникнет, поскольку «вместо триггера» будет обрабатывать операцию обновления этого сложного представления. И когда код будет выполнен, местоположение сотрудника XXX будет обновлено до «Франция» из «Японии».
BEGINUPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name='XXX';COMMIT;END;/
SELECT * FROM guru99_emp_view;
Пояснение к коду:
- Строка кода 49-53: Обновление местоположения «XXX» на «FRANCE». Это успешно, потому что триггер INSTEAD OF остановил фактический оператор обновления на представлении и выполнил обновление базовой таблицы.
- Строка кода 55: Проверка обновленной записи.
Выход:
Процедура PL / SQL успешно завершена
ИМЯ СОТРУДНИКА | DEPT_NAME | МЕСТО РАСПОЛОЖЕНИЯ |
ZZZ | HR | Соединенные Штаты Америки |
ГГГ | ПРОДАЖИ | Великобритания |
XXX | ФИНАНСОВЫЕ | ФРАНЦИЯ |
Составной триггер
Составной триггер - это триггер, который позволяет вам определять действия для каждой из четырех временных точек в теле одного триггера. Четыре различных точки синхронизации, которые он поддерживает, указаны ниже.
- ПЕРЕД ЗАЯВЛЕНИЕМ - уровень
- BEFORE ROW - уровень
- ПОСЛЕ РЯДА - уровень
- ПОСЛЕ ЗАЯВЛЕНИЯ - уровень
Это дает возможность комбинировать действия для разного времени в один и тот же триггер.
CREATE [ OR REPLACE ] TRIGGERFOR[INSERT | UPDATE | DELET… .]ON BEFORE STATEMENT ISBEGIN ;END BEFORE STATEMENT;BEFORE EACH ROW ISBEGIN ;END EACH ROW;AFTER EACH ROW ISBEGIN ;END AFTER EACH ROW;AFTER STATEMENT ISBEGIN ;END AFTER STATEMENT;END;
Объяснение синтаксиса:
- Приведенный выше синтаксис показывает создание триггера COMPOUND.
- Декларативный раздел является общим для всего исполнительного блока в теле триггера.
- Эти 4 блока синхронизации могут быть в любой последовательности. Необязательно иметь все эти 4 блока синхронизации. Мы можем создать СЛОЖНЫЙ триггер только на то время, которое требуется.
Пример 1. В этом примере мы собираемся создать триггер для автоматического заполнения столбца зарплаты значением по умолчанию 5000.
CREATE TRIGGER emp_trigFOR INSERTON empCOMPOUND TRIGGERBEFORE EACH ROW ISBEGIN:new.salary:=5000;END BEFORE EACH ROW;END emp_trig;/
BEGININSERT INTO EMP VALUES(1004,‘CCC’,15000,‘AAA’,30);COMMIT;END;/
SELECT * FROM emp WHERE emp_no=1004;
Пояснение к коду:
- Строка кода 2-10 : Создание составного триггера. Он создается для отсчета времени ПЕРЕД ROW- level, чтобы заполнить зарплату значением по умолчанию 5000. Это изменит зарплату на значение по умолчанию «5000» перед вставкой записи в таблицу.
- Строка кода 11-14 : Вставить запись в таблицу emp.
- Строка кода 16 : Проверка вставленной записи.
Выход:
Триггер создан
Процедура PL / SQL успешно завершена.
EMP_NAME | EMP_NO | ЗАРПЛАТА | УПРАВЛЯЮЩИЙ ДЕЛАМИ | DEPT_NO |
CCC | 1004 | 5000 | AAA | 30 |
Включение и отключение триггеров
Триггеры могут быть включены или отключены. Чтобы включить или отключить триггер, необходимо задать оператор ALTER (DDL) для триггера, который его отключает или включает.
Ниже приведен синтаксис включения / отключения триггеров.
ALTER TRIGGER[ENABLE|DISABLE];ALTER TABLE [ENABLE|DISABLE] ALL TRIGGERS;
Объяснение синтаксиса:
- Первый синтаксис показывает, как включить / выключить одиночный триггер.
- Второй оператор показывает, как включить / отключить все триггеры в определенной таблице.
Резюме
В этой главе мы узнали о триггерах PL / SQL и их преимуществах. Мы также изучили различные классификации и обсудили триггер INSTEAD OF и триггер COMPOUND.