Aug 27 2008

Триггеры в MySQL

Category: MySQLingvar @ 23:08

Поддержка триггеров появилась в MySQL 5.0.2. Триггер — это аналог процедуры, который ассоциируется с конкретной таблицей и запускается при наступлении определенных событий связанных с этой самой таблицей. Событий для таблиц всего несколько: INSERT, DELETE, UPDATE.

Пример триггера INSERT для таблицы News — записываем в поле `created_at` дату и время создания записи. Конечно можно было воспользоваться TIMESTAMP, но в данном случае это сделано в качестве простого примера:

DROP TRIGGER IF EXISTS  `database`.`news_insert`;

DELIMITER $$

CREATE
    DEFINER = CURRENT_USER
    TRIGGER `database`.`news_insert` BEFORE INSERT
    ON `database`.`news`
    FOR EACH ROW BEGIN
      SET NEW.`created_at` = NOW();
    END$$

DELIMITER ;

В триггере используем оператор DEFINER = CURRENT_USER, его можно опустить, тогда в этом случае будут права текущего пользователя, но можно и установить другого, например:

CREATE
    DEFINER = `user`@'localhost'
    TRIGGER `database`.`news_insert` BEFORE INSERT
....

До версии MySQL 5.1.6 для создания триггеров требовались полномочия суперпользователя, что не совсем хорошо, т.к. во-первых на шаровых хостингах не предоставляют полномочия суперпользователя, а во-вторых это потенциальная брешь в системе безопасности. Без прав суперпользователя в MySQL ниже 5.1.6 получим ошибку:

ERROR 1227 (42000): Access denied; you need the SUPER privilege for this operation

Пример создание пользователя в MySQL и предоставления ему обычных прав:

#DROP USER 'user'@'localhost';
# ''
CREATE USER 'user'@'localhost' IDENTIFIED BY PASSWORD '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4;
GRANT USAGE ON *.* TO 'user'@'localhost' IDENTIFIED BY PASSWORD '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4;
GRANT ALL PRIVILEGES ON `database`.* TO 'user'@'localhost' WITH GRANT OPTION;

Пример создание пользователя и предоставления ему прав суперпользователя:

CREATE USER 'user'@'localhost' IDENTIFIED BY 'my_password';
GRANT USAGE ON *.* TO 'user'@'localhost';
GRANT ALL PRIVILEGES ON `database`.* TO 'user'@'localhost' WITH GRANT OPTION;
GRANT SUPER ON *.* TO 'user'@'localhost';

Ссылки по теме:
MySQL 5.1 Reference Manual :: 24.1 CREATE TRIGGER Syntax
MySQL 5.1 Reference Manual :: 12.5.1.3 GRANT Syntax
PDF: MySQL 5.0 Triggers
Habrahabr: Триггеры в MySQL

Tags:

One Response to “Триггеры в MySQL”

  1. aliputin says:

    Нужна помощь.
    Триггер не срабатывает при импорте csv. Есть таблица с триггером. Импортирую csv-файл в эту таблицу, триггер не срабатывает. Когда вручную вставляю запись в эту таблицу, триггер срабатывает.

    В чем подвох?

Leave a Reply to aliputin