Что такое триггеры в базах данных
Что проверяют
Знаете ли вы механику и понимаете ли, почему к триггерам относятся настороженно.
Как отвечать
Триггер это процедура, которую база выполняет автоматически при событии над таблицей: INSERT, UPDATE, DELETE, а также TRUNCATE в PostgreSQL.
Параметры триггера:
- момент:
BEFORE(до записи, можно изменить строку или отменить операцию),AFTER(после, для действий по факту),INSTEAD OF(для представлений, чтобы сделать их изменяемыми); - зернистость:
FOR EACH ROWна каждую строку либоFOR EACH STATEMENTодин раз на весь запрос; - доступ к данным: псевдозаписи
NEWиOLD.
В PostgreSQL триггер не содержит логику сам, а вызывает триггерную функцию, возвращающую trigger.
Уместные применения: журнал изменений для аудита, автоматическое проставление updated_at, поддержание производного значения, сложная проверка, которую не выражает ограничение, изменяемые представления.
Почему их не любят, и это главное в ответе:
- невидимая логика. В коде написан простой
INSERT, а происходит ещё пять вещей. Разработчик, читающий приложение, о них не узнает; - отладка и воспроизведение: ошибка возникает внутри базы, стек оттуда не тот, к которому привыкли;
- производительность: построчный триггер выполняется на каждую строку, и пакетное обновление миллиона строк умножает его стоимость на миллион;
- сюрпризы для ORM:
BEFORE-триггер изменил значение, а в памяти приложения осталось исходное, и объекты расходятся с базой; - логика живёт вне репозитория кода: версионируется только через миграции, ревью проходит хуже, тесты писать неудобно;
- каскады: триггер, вызывающий изменение другой таблицы, у которой свой триггер, даёт трудноотслеживаемую цепочку.
Практический вывод: техническая обвязка вроде аудита и меток времени в триггерах приемлема, бизнес-правила лучше держать в приложении, где их видно и можно протестировать.
Где спотыкаются
Переносят в триггеры бизнес-логику ради «надёжности».
Не различают BEFORE и AFTER.
Пишут построчный триггер там, где хватило бы одного на запрос.
Забывают, что триггер выполняется и при массовых операциях миграции.