Поиск…


Синтаксис

  • CREATE [DEFINER = {пользователь | CURRENT_USER}] TRIGGER trigger_name trigger_time trigger_event ON tbl_name ДЛЯ КАЖДОГО ROW [trigger_order] trigger_body
  • trigger_time: {ПЕРЕД | ПОСЛЕ }
  • trigger_event: {INSERT | ОБНОВЛЕНИЕ | УДАЛЯТЬ }
  • trigger_order: {FOLLOWS | PRECEDES} other_trigger_name

замечания

Вам нужно обратить внимание на два момента, если вы уже используете триггеры для других БД:

ДЛЯ КАЖДОЙ РУКИ

FOR EACH ROW является обязательной частью синтаксиса

Вы не можете сделать заявление триггера (один раз по запросу) , как Oracle сделать. Это скорее проблема, связанная с производительностью, чем реальная пропавшая функция

СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ТРИГГЕР

CREATE OR REPLACE не поддерживается MySQL

MySQL не разрешает этот синтаксис, вместо этого вы должны использовать следующее:

DELIMITER $$

DROP TRIGGER IF EXISTS myTrigger;
$$
CREATE TRIGGER myTrigger
-- ...

$$
DELIMITER ;

Будьте осторожны, это не атомная транзакция :

  • вы потеряете старый триггер, если CREATE не CREATE
  • при большой нагрузке между DROP и CREATE могут выполняться другие операции, используйте LOCK TABLES myTable WRITE; сначала, чтобы избежать несогласованности данных и UNLOCK TABLES; после CREATE выпустить таблицу

Базовый триггер

Создать таблицу

mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
Query OK, 0 rows affected (0.03 sec)

Создать триггер

mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account
    -> FOR EACH ROW SET @sum = @sum + NEW.amount;
Query OK, 0 rows affected (0.06 sec)

Оператор CREATE TRIGGER создает триггер с именем ins_sum, который связан с таблицей учетных записей. Он также включает в себя положения, которые определяют время срабатывания триггера, событие запуска и что делать, когда активируется триггер

Вставить значение

Чтобы использовать триггер, установите переменную аккумулятора (@sum) в ноль, выполните инструкцию INSERT и затем посмотрите, какое значение имеет значение после переменной:

mysql> SET @sum = 0;
mysql> INSERT INTO account VALUES(137,14.98),(141,1937.50),(97,-100.00);
mysql> SELECT @sum AS 'Total amount inserted';
+-----------------------+
| Total amount inserted |
+-----------------------+
| 1852.48               |
+-----------------------+

В этом случае значение @sum после выполнения инструкции INSERT составляет 14.98 + 1937.50 - 100, или 1852.48.

Drop Trigger

mysql> DROP TRIGGER test.ins_sum;

Если вы удалите таблицу, все триггеры для таблицы также будут удалены.

Типы триггеров

тайминг

Существуют два модификатора времени действия триггера:

  • BEFORE триггера активируется запрос,
  • AFTER запускать огонь после смены.

Событие триггера

Существует три события, к которым можно подключить триггеры:

  • INSERT
  • UPDATE
  • DELETE

Пример примера Insert

DELIMITER $$

CREATE TRIGGER insert_date 
    BEFORE INSERT ON stack
    FOR EACH ROW
BEGIN
        -- set the insert_date field in the request before the insert
    SET NEW.insert_date = NOW();
END;

$$
DELIMITER ;

Пример обновления перед обновлением

DELIMITER $$

CREATE TRIGGER update_date 
    BEFORE UPDATE ON stack
    FOR EACH ROW
BEGIN
        -- set the update_date field in the request before the update
    SET NEW.update_date = NOW();
END;

$$
DELIMITER ;

После удаления примера триггера

DELIMITER $$

CREATE TRIGGER deletion_date 
    AFTER DELETE ON stack
    FOR EACH ROW
BEGIN
        -- add a log entry after a successful delete
    INSERT INTO log_action(stack_id, deleted_date) VALUES(OLD.id, NOW());
END;

$$
DELIMITER ;


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow