Вопрос
Я слышал о триггерах, и у меня есть несколько вопросов.
Что такое триггеры?
Как мне их настроить?
Существуют ли какие-либо меры предосторожности, помимо типичных мер SQL, которые следует принять?
Решение
Триггеры позволяют выполнять функцию в базе данных при возникновении определенных событий (например, вставки в таблицу).
Я не могу конкретно комментировать MySQL.
Меры предосторожности:Триггеры могут быть очень заманчивыми: когда вы впервые начинаете их использовать, они кажутся волшебным средством от всех видов проблем.Но они делают «волшебные» вещи: если вы не знаете базу данных изнутри, может показаться, что происходят действительно странные вещи (например, вставки в другие таблицы, изменение входных данных и т. д.).Прежде чем реализовывать что-то в качестве триггера, я бы серьезно подумал о том, чтобы вместо этого принудительно использовать API вокруг схемы (желательно в базе данных, но если вы не можете, снаружи).
Для некоторых вещей я бы все еще использовал триггеры
- Отслеживание полей «date_created» и «date_last_edited»
- Вставка «ID» (в oracle, где нет поля автоматического идентификатора)
- Сохранение истории изменений
Вещи, для которых вы не хотели бы использовать триггеры
- бизнес-правила/логика
- все, что подключается за пределами базы данных (например, вызов веб-сервиса)
- Контроль доступа
- Все, что не является транзакционным (все, что вы делаете в триггере, ДОЛЖНО иметь возможность отката транзакции)
Другие советы
От dev.mysql.com, триггер
... именованный объект базы данных, который связан с таблицей и активируется, когда возникает конкретное событие для таблицы.
Синтаксис для их создания также задокументировано на этом сайте.
Кратко,
CREATE
[DEFINER = { user | CURRENT_USER }]
TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt
И они приводят пример:
CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
CREATE TRIGGER ins_sum BEFORE INSERT ON account FOR EACH ROW SET @sum = @sum + NEW.amount;
Вам, по крайней мере, нужно соблюдать все ограничения на сохраненные функции.Вы не сможете блокировать таблицы, изменять представления или изменять таблицу, вызвавшую срабатывание триггера.Также вызывает может вызвать проблемы с репликацией.
Триггер — это именованный объект базы данных, связанный с таблицей и активирующийся при возникновении определенного события для таблицы.
Чтобы создать триггер:
CREATE TRIGGER triggerName [BEFORE|AFTER] [INSERT|UPDATE|DELETE|REPLACE] ON tableName FOR EACH ROW SET stuffToDoHERE;
Несмотря на то, что я ответил на эту часть, другой вопрос все еще остается в силе.
Этот вопрос старый, и другие ответы очень хорошие, но поскольку пользователь спросил о мерах предосторожности, которые следует принять, я хочу кое-что добавить:
- Если вы используете репликацию в сложной среде, не используйте триггеры массово и не вызывайте хранимые процедуры из триггеров.
- Триггеры в MySQL работают медленно.
- Вы не можете использовать некоторые операторы SQL в триггерах.Некоторые операторы разрешены, но их следует избегать, например LOCK.Общее правило таково:если вы не до конца понимаете последствия того, что делаете, вам не следует этого делать.
- Триггеры могут вызывать бесконечные циклы, поэтому будьте осторожны.