Да. AFAIK, MySQL 5.1 не внес никаких изменений в семантику работы триггеров. MySQL пытается поддерживать спецификацию ANSI / ISO SQL для семантики триггера.
Вы можете представить себе последовательность операций, которая выполняется при записи строки в базу данных:
- Запуск ДО триггеров
- Оценивать ограничения, применять
NOT NULL
, применять DEFAULT
значения
- Запись строки в базу данных
- Обновление индексов
- Запуск ПОСЛЕ триггеров
Как только вы достигли триггера AFTER, уже слишком поздно менять значения в строке. В некоторых базах данных вы можете установить NEW.somecolumn = 1234
, но это изменение игнорируется по завершении триггера AFTER. В других базах данных он помогает вам понять свою ошибку, сообщая об ошибке либо при определении триггера, либо при запуске триггера.
Триггеры AFTER лучше всего использовать для дополнительных действий, выполняемых в результате INSERT / UPDATE строки, таких как упомянутое вами протоколирование аудита. С одной стороны, MySQL разрешает только один триггер на действие для каждой таблицы, поэтому, если вы также используете триггер BEFORE для изменения значений и применения бизнес-правил, теперь вы можете по крайней мере сохранить дополнительные действия в отдельном триггере. Это облегчает обновление одного или другого.
Другое соображение заключается в том, что вам, вероятно, следует выполнять только дополнительные действия после , когда вы знаете, что строка успешно сохранена. Например. было бы неправильно регистрировать изменения в триггере BEFORE, а затем отменять их из-за ограничения NOT NULL.
Для действий DELETE, когда вам нужно удалить зависимые строки в других таблицах, вам все равно придется делать это в триггере BEFORE.