MySQL
TRIGGERS
Поиск…
Синтаксис
- 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 ;