middle
Что такое триггер?
Триггер (trigger) — хранимая процедура особого типа, которая автоматически выполняется сервером БД при определённом событии модификации данных (INSERT, UPDATE, DELETE) в заданной таблице. Пользователь не вызывает триггер явно — он срабатывает как реакция на событие.
Моменты срабатывания
| Момент | Ключевое слово | Поведение |
|---|---|---|
| До события | BEFORE |
Может изменить вставляемые/обновляемые данные или отменить операцию |
| После события | AFTER |
Выполняется после записи изменений, может выполнять сопутствующую логику |
| Вместо события | INSTEAD OF |
Заменяет событие (используется для обновляемых представлений) |
Уровни срабатывания
FOR EACH ROW— триггер вызывается для каждой затронутой строкиFOR EACH STATEMENT— триггер вызывается один раз для всего оператора (независимо от количества строк)
Применение
- Обеспечение целостности данных и реализация сложной бизнес-логики
- Аудит изменений (автоматическая запись в таблицу истории)
- Каскадные обновления связанных данных
- Валидация данных, которую нельзя выразить через
CHECK
Все изменения, произведённые триггером, выполняются в той же транзакции, что и вызвавшее его событие. При обнаружении ошибки или нарушении целостности данных вся транзакция может быть откачена.
Пример триггера для аудита
CREATE OR REPLACE FUNCTION log_salary_changes()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO salary_audit (employee_id, old_salary, new_salary, changed_at)
VALUES (OLD.id, OLD.salary, NEW.salary, NOW());
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trg_salary_audit
AFTER UPDATE OF salary ON employees
FOR EACH ROW
WHEN (OLD.salary IS DISTINCT FROM NEW.salary)
EXECUTE FUNCTION log_salary_changes();
На собеседовании: объясните, что триггер — это автоматическая реакция на DML-событие, упомяните
BEFORE/AFTERи уровниROW/STATEMENT. Частая ошибка — не знать, что триггер выполняется в той же транзакции и может её откатить.