MyTetra Share
Делитесь знаниями!
Триггеры в MySQL, краткое введение
Время создания: 25.12.2012 11:55
Раздел: Компьютер - Программирование - SQL - MySQL, MariaDB
Запись: xintrea/mytetra_syncro/master/base/1356422150h2wv3ruqvf/text.html на raw.github.com

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

Поддержка триггеров в MySQL началась с версии 5.0.2

Синтаксис создания триггера:

CREATE TRIGGER trigger_name trigger_time trigger_event

ON tbl_name FOR EACH ROW trigger_stmt* This source code was highlighted with Source Code Highlighter.

  • trigger_name — название триггера
  • trigger_time — Время срабатывания триггера. BEFORE — перед событием. AFTER — после события.
  • trigger_event — Событие:
  • insert — событие возбуждается операторами insert, data load, replace
  • update — событие возбуждается оператором update
  • delete — событие возбуждается операторами delete, replace. Операторы DROP TABLE и TRUNCATE не активируют выполнение триггера
  • tbl_name — название таблицы
  • trigger_stmt выражение, которое выполняется при активации триггера

Применение: создание лога

Исходные данные:

— таблица, за которой мы будем следить

CREATE TABLE `test` (

`id` INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,

`content` TEXT NOT NULL

) ENGINE = MYISAM

— лог

CREATE TABLE `log` (

`id` INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,

`msg` VARCHAR( 255 ) NOT NULL,

`time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,

`row_id` INT( 11 ) NOT NULL

) ENGINE = MYISAM

— триггер

DELIMITER |

CREATE TRIGGER `update_test` AFTER INSERT ON `test`

FOR EACH ROW BEGIN

INSERT INTO log Set msg = 'insert', row_id = NEW.id;

END;* This source code was highlighted with Source Code Highlighter.

Теперь добавьте запись в таблицу test. В таблице log тоже появится запись, обратите внимание на поле row_id, в нем хранится id вставленной вами строки.

Расширенный лог

Исходные данные:

— Удаляем триггер

DROP TRIGGER `update_test`;

— Cоздадим еще одну таблицу,

— в которой будут храниться резервные копии строк из таблицы test

CREATE TABLE `testing`.`backup` (

`id` INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,

`row_id` INT( 11 ) UNSIGNED NOT NULL,

`content` TEXT NOT NULL

) ENGINE = MYISAM

— триггеры

DELIMITER |

CREATE TRIGGER `update_test` before update ON `test`

FOR EACH ROW BEGIN

INSERT INTO backup Set row_id = OLD.id, content = OLD.content;

END;

CREATE TRIGGER `delete_test` before delete ON `test`

FOR EACH ROW BEGIN

INSERT INTO backup Set row_id = OLD.id, content = OLD.content;

END* This source code was highlighted with Source Code Highlighter.

Теперь если мы отредактируем или удалим строку из test она скопируется в backup.

UPD: для создания триггеров в версии до 5.1.6 требуются полномочия суперпользователя.

Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования