Триггеры в MySQL (от англ. Trigger) — это специальная хранимая процедура языка SQL, которая исполняется при наступлении определенного события (например, вставка, обновление, удаление записи). Она не может вызываться вручную. Поддержка этой процедуры стала доступна в MySQL 5.0.2, а так же во всех версиях MariaDB.
Процедура хранится в СУБД MySQL и ее вызов никак не зависит от используемого языка программирования или приложения.
Преимущества использования MySQL Triggers
Помимо того, что использование триггеров не зависит от приложения и используемого языка программирования, имеется еще ряд преимуществ:
- Сокращение сетевого трафика
- Минимизация используемых ресурсов
- Отсутствие необходимости передачи промежуточных результатов приложению
- Обеспечение целостности данных
- Триггер запускается автоматически
Все производимые операции считаются транзакциями, поэтому в случае ошибки вы легко можете откатить те или иные изменения.
Синтаксис создания триггера
Синтаксис созадния триггера довольно прост:
CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt
Где:
- 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 выражение, которое выполняется при активации триггера
Стоит обратить внимание, что триггеры могут быть привязаны не к таблице, а, непосредственно, к представлению (VIEW). В таком случае с их помощью реализуется механизм «обновляемого представления».
Пример создания триггера
Давайте рассмотрим следующий пример. У нас есть 2 таблицы test и log. Создадим триггер, который будет записывать событие в таблицу log при добавлении записи в таблицу test.
Создадим тестовые таблицы:
/*Таблица test, за которой мы будем следить*/
CREATE TABLE `test` ( `id` INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, `content` TEXT NOT NULL );
/*Таблица log, куда будем записывать информацию*/
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 );
/*Создание триггера*/
DELIMITER | CREATE TRIGGER `update_test` AFTER INSERT ON `test` FOR EACH ROW BEGIN INSERT INTO log Set msg = ‘insert’, row_id = NEW.id; END;
Таким образом, мы создали триггер update_test, который будет срабатывать при добавлении записи в таблицу test. И, теперь, в таблице log так же появится такая же запись. А в строке row_id будет храниться id записи.
Здесь, оператор DELIMITER используется для определения знака начала/окончания процедуры. Он может быть любым. Главное, чтобы этот знак не использовался в самое процедуре.
Просмотр и удаление триггеров
Чтобы посмотреть все созданные триггеры, используйте команду:
SHOW TRIGGERS;
А чтобы удалить триггер, используйте команду DROP TRIGGER. В нашем примере, чтобы удалить созданный тригер:
DROP TRIGGER `update_test`;
Особенности использования триггеров
На что стоит обратить внимание при использовании триггеров:
- Если вы удалите таблицу, к которой привязаны триггеры, то они тоже удалятся
- Триггер запускается для каждой записи в таблице. Если ваш запрос затрагивает, к примеру, 5 записей, то триггер будет запущен ровно 5 раз
- Для создания триггера, вы должны иметь привелегии SUPER
Когда Ваш проект уже вырастит до серьезных размеров, Вам потребуется аренда сервера в Дата-Центре. В RigWEB к каждому выделенному серверу предоставляется бесплатное администрирование. Мы поможем Вам настроить триггеры, если необходимо.