Вопрос

Я слышал о триггерах, и у меня есть несколько вопросов.
Что такое триггеры?
Как мне их настроить?
Существуют ли какие-либо меры предосторожности, помимо типичных мер 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.Общее правило таково:если вы не до конца понимаете последствия того, что делаете, вам не следует этого делать.
  • Триггеры могут вызывать бесконечные циклы, поэтому будьте осторожны.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top