Настройка триггеров MySQL

Я слышал о триггерах, и у меня есть несколько вопросов.
Что такое триггеры? Как настроить их?
Существуют ли какие-либо меры предосторожности, помимо типичных SQL-данных, которые должны быть приняты?

Ответ 1

Триггеры позволяют выполнять функцию в базе данных, когда происходят определенные события (например, вставка в таблицу).

Я не могу комментировать mysql специально.

Меры предосторожности: триггеры могут быть очень заманчивыми, когда вы начинаете их использовать, они кажутся волшебной пулей для всех видов проблем. Но они делают "волшебные" вещи, если вы не знаете базу данных наизнанку, может показаться, что действительно происходят странные вещи (например, вставки в другие таблицы, изменение входных данных и т.д.). Прежде чем внедрять объекты в качестве триггера, я бы серьезно подумал об использовании API-интерфейса вокруг схемы (желательно в базе данных, но снаружи, если вы не можете).

Некоторые вещи, которые я по-прежнему использую триггеры для

  • Отслеживание полей "date_created" и "date_last_edited"
  • Вставка "ID" (в оракуле, где нет поля автодетектора)
  • Сохранение истории изменений

Вещи, которые вы не хотели бы использовать триггеры для

  • бизнес-правила/логика
  • все, что подключается за пределами базы данных (например, вызов веб-службы)
  • Контроль доступа
  • Все, что не является транзакционным (все, что вы делаете в триггере, ДОЛЖНО иметь возможность отката с транзакцией)

Ответ 2

Из 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;

Вам, по крайней мере, нужно соблюдать все ограничения на сохраненные функции. Вы не сможете блокировать таблицы, изменять представления или изменять таблицу, запускающую триггер. Также триггеры могут вызвать проблемы с репликацией.

Ответ 3

Триггер - это именованный объект базы данных, который связан с таблицей, и активируется, когда определенное событие возникает для таблицы.

Чтобы создать триггер:

CREATE TRIGGER triggerName [BEFORE|AFTER] [INSERT|UPDATE|DELETE|REPLACE] ON tableName FOR EACH ROW SET stuffToDoHERE;


Несмотря на то, что я ответил на эту часть, остается еще один вопрос.

Ответ 4

Этот вопрос старый, и другие ответы очень хорошие, но поскольку пользователь спросил о мерах предосторожности, которые должны быть приняты, я хочу что-то добавить:

  • Если вы используете репликацию в сложной среде, не используйте массив триггеров и не вызывайте хранимые процедуры из триггеров.
  • Триггеры медленны в MySQL.
  • Вы не можете использовать некоторые инструкции SQL внутри триггеров. И некоторые утверждения разрешены, но их следует избегать, например, LOCK. Общее правило: если вы не полностью понимаете последствия того, что вы делаете, вы не должны этого делать.
  • Триггеры могут вызывать бесконечные циклы, поэтому будьте осторожны.