12
Сложности
Код вызывается неявно
сложно отследить логику выполнения
Правила видимости изменчивой триггерной функции
виден результат триггеров BEFORE ROW или INSTEAD OF ROW
Порядок вызова триггеров для одного события
триггеры отрабатывают в алфавитном порядке
Не предотвращается зацикливание
триггер может вызвать срабатывание других триггеров
Можно нарушить ограничения целостности
например, исключив из обработки строки, которые должны удалиться
Однако не стоит злоупотреблять триггерами. Триггеры срабатывают
неявно, что сильно затрудняет понимание логики работы и крайне
усложняет поддержку приложения. Попытки реализовать сложную
логику на триггерах обычно заканчиваются плачевно.
В некоторых случаях вместо триггеров можно использовать
вычисляемые поля (GENERATED ALWAYS AS … STORED). Такое
решение — если оно подходит — будет заведомо проще и прозрачнее.
Есть ряд тонкостей, связанных с триггерами, которые мы сознательно
не рассматриваем подробно:
●
правила видимости изменчивых (volatile) функций в триггерах
BEFORE ROW и INSTEAD OF ROW (не стоит обращаться к таблице,
полагаясь на порядок, в котором сработают триггеры);
●
порядок вызова нескольких триггеров, обрабатывающих одно и то же
событие (не стоит усугублять и без того неявное срабатывание
триггеров завязкой на последовательность обработки);
●
возможность зацикливания в случае каскадного срабатывания
других триггеров, которые, в свою очередь, могут приводить к новым
срабатываниям данного триггера;
●
возможность нарушить ограничения целостности (например, при
исключении из обработки строки, которая удаляется условием ON
DELETE CASCADE, может быть нарушена ссылочная целостность).
Если вы столкнулись с тем, что эти тонкости важны для вашего
приложения — серьезно задумайтесь.