Во-первых, триггеры - это фрагменты кода, которые запускаются, когда в базе данных происходит конкретное событие (например, INSERT / UPDATE / DELETE для конкретной таблицы). Триггеры выполняются неявно ДО или ПОСЛЕ оператора DML, и триггеры не могут выполняться явно, как хранимые процедуры.
Существует также два типа триггеров - триггеры УРОВНЯ СОСТОЯНИЯ и триггеры УРОВНЯ СТРОКИ.
Триггеры STATEMENT LEVEL срабатывают ДО или ПОСЛЕ выполнения оператора.
Триггеры ROW LEVEL срабатывают ДО или ПОСЛЕ операции, выполняемой для каждой отдельной строки, на которую воздействует операция.
Итак, у нас есть 12 типов триггеров:
1. BEFORE INSERT STATEMENT
2. BEFORE INSERT ROW
3. AFTER INSERT STATEMENT
4. AFTER INSERT ROW
5. BEFORE UPDATE STATEMENT
6. BEFORE UPDATE ROW
7. AFTER UPDATE STATEMENT
8. AFTER UPDATE ROW
9. BEFORE DELETE STATEMENT
10. BEFORE DELETE ROW
11. AFTER DELETE STATEMENT
12. AFTER DELETE ROW
Для события может быть закодировано несколько триггеров с указанием порядка их приоритетности выполнения.
Всякий раз, когда мы выполняем запрос DML (INSERT / UPDATE / DELETE) к базе данных, этот запрос выполняется в транзакции. Следовательно, когда запрос выполняется -
- Стол заблокирован
- СУБД проверяет наличие триггеров, которые запускаются ДО выполнения инструкции
- Выполняет фактическую инструкцию SQL построчно.
- Ищите триггер ДО для КАЖДОЙ СТРОКИ. Если найден, исполнен.
- Проверка на ошибки. Если есть, откат изменений, внесенных оператором или его триггерами.
- Все триггеры ПОСЛЕ КАЖДОЙ СТРОКИ найдены и выполнены.
- Все триггеры ПОСЛЕ ЗАЯВЛЕНИЯ найдены и выполнены.
Различные СУБД управляют транзакциями по-разному. За подробностями обращайтесь к их документации.
Многие СУБД хранят триггеры только в текстовом формате, а не скомпилированные хранимые процедуры.
Лучше всего вызывать хранимые процедуры из тела триггера, поскольку хранимые процедуры выполняются намного быстрее, чем триггеры.