Ответ
Триггер (Trigger) — это специальная хранимая процедура в СУБД, которая автоматически выполняется (срабатывает) при наступлении определенного события с таблицей: INSERT, UPDATE или DELETE. Триггеры привязаны к таблице и позволяют реализовать сложную бизнес-логику и поддержание целостности данных непосредственно на уровне БД.
Типичные сценарии использования:
-
Аудит и логирование изменений:
CREATE TRIGGER audit_employee_update AFTER UPDATE ON Employees FOR EACH ROW BEGIN INSERT INTO AuditLog (table_name, record_id, action, old_value, new_value, changed_at, changed_by) VALUES ('Employees', OLD.id, 'UPDATE', OLD.salary, NEW.salary, CURRENT_TIMESTAMP, USER()); END;Здесь
OLDиNEW— псевдонимы для строк до и после изменения. -
Поддержание денормализованных данных или вычисляемых полей:
CREATE TRIGGER update_order_total AFTER INSERT ON OrderItems FOR EACH ROW BEGIN UPDATE Orders SET total_amount = ( SELECT SUM(quantity * price) FROM OrderItems WHERE order_id = NEW.order_id ) WHERE id = NEW.order_id; END; -
Сложная валидация, которую нельзя выразить через
CHECK:CREATE TRIGGER validate_salary BEFORE INSERT ON Employees FOR EACH ROW BEGIN IF (NEW.salary > (SELECT avg_salary * 2 FROM Department WHERE id = NEW.department_id)) THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Salary exceeds department limit'; END IF; END;
Важные особенности и недостатки:
- Прозрачность: Логика в триггерах скрыта от прикладного кода, что может усложнить отладку.
- Производительность: Каждая операция с таблицей несет дополнительную нагрузку от выполнения триггера.
- Каскадное срабатывание: Триггер может модифицировать другую таблицу, в которой тоже есть триггер, что может привести к цепочке вызовов.
- Порядок: В некоторых СУБД можно задавать порядок выполнения нескольких триггеров на одно событие.
Итог: Триггеры — мощный, но требующий осторожного применения инструмент для реализации логики, критичной к целостности данных, непосредственно в БД.