![]() |
|
   [ главная ]   [ рейтинг статей ]   [ справочник радиолюбителя ]   [ новости мира ИТ ] |
|
|
Простой журнал аудита на триггерах MySQLНебольшая заметка об использовании триггеров в СУБД MySQL. Несмотря на достаточно приличный возраст этой СУБД, поддержка триггеров появилась только в 5-й версии и достаточно мало описана на русском языке. ВведениеТри́ггер (англ. trigger) — это хранимая процедура особого типа, которую пользователь не вызывает непосредственно, а исполнение которой обусловлено наступлением определенного события (действием) — по сути добавлением INSERT или удалением DELETE строки в заданной таблице, или модификации UPDATE данных в определенном столбце заданной таблицы реляционной базы данных. Триггеры применяются для обеспечения целостности данных и реализации сложной бизнес-логики. Триггер запускается сервером автоматически при попытке изменения данных в таблице, с которой он связан. Триггер хранится вместе с таблицами в бинарном виде — однажды созданный он не может быть изменен, возможно только удалить его и записать новый. Триггер активируется, когда происходит определенное событие для конкретной таблицы. Таких события все три:
Поддержка для триггеров включена начиная с MySQL 5.0.2. Постановка задачиДля вас наверно не будет новостью, что можно создавать пользователей MySQL с разными привилегиями. При этом привилегии могут быть настроены очень тонко — вплоть до конкретного столбца. Например, у вас база данных магазина. Одному пользователю можно разрешить
только просматривать наличие того или иного товара, другой может редактировать
количество оставшихся копий, а третий может изменять стоимость. Более подробную
информацию о пользователях вы можете получить на узле MySQL из статьи < Предположим, вы так и поступили и у нас имеется несколько пользователей. Само по себе разделение прав и обязанностей уже большой шаг в сторону повышения безопасности. Однако этого явно не достаточно — если товар стоящий 100 у.е. вдруг будет продан за 10, как найти виновного? Кто изменил стоимость в БД? Или вдруг обнаружится, что закуплено было 10 экземпляров, по факту продано 5, а в остатке числится только 3. Куда делись еще 2? Кто списал товар? Вот тут нам понадобится журнал аудита — который будет хранить информацию о том кто и что делал с записями в БД. MySQL предоставляет такую возможность — существует так называемый
Наш журнал аудита это новая таблица в БД. О существовании такой таблицы должно знать как можно меньше людей. Назовем нашу таблицу mylog. Пусть в ней будет 4 столбца: Таблицу легко создать, используя phpMyAdmin** с помощью следующего запроса: CREATE TABLE `mylog` ( `id` INT NOT NULL AUTO_INCREMENT , `user` VARCHAR( 20 ) NOT NULL , `query` VARCHAR( 15 ) NOT NULL , `timestamp` TIMESTAMP NOT NULL , PRIMARY KEY ( `id` ) ); Так же пусть у нас есть таблица table1, за
изменениями в которой мы и будем следить. Создадим простой триггерКаждое из трех поддерживаемых триггерами событий (INSERT, UPDATE и DELETE) как бы подразделяется еще на два:
Иными словами у нас есть не 3 события:
а целых 6:
Например, событие BEFORE INSERT произойдет перед
вставкой новой строки в таблицу, а событие AFTER INSERT
после вставки. На каждое из 6 событий для одной конкретной таблицы можно повесить только один триггер. Таким образом, мы можем записать в наш журнал аудита (в таблицу mylog) все попытки выполнения (события BEFORE) запросов или только удачные (события AFTER)**. Давайте записывать все попытки — будем использовать события BEFORE. Следующим запросом к MySQL мы создадим триггер с именем my_trigger для таблицы table1: CREATE TRIGGER `my_trigger` BEFORE INSERT ON `table1` FOR Как видите все просто: триггер вставляет строку в таблицу mylog. Однако такой триггер нужно еще немного подкорректировать — он должен вставлять не текст 'имя_пользователя' в качестве значения для поля user, а реальное имя пользователя. Что бы узнать реальное имя пользователя воспользуемся одной из встроенных
функций MySQL — USER(); Эта функция возвращает
строку с именем пользователя MySQL. (Более подробно о функциях MySQL можно
узнать на
Вот так будет выглядеть полностью рабочий триггер: CREATE TRIGGER `my_trigger` BEFORE INSERT ON `table1` FOR EACH ROW INSERT INTO `mylog` SET `user`= USER(), `query`='insert'; По аналогии могут быть созданы триггеры для оставшихся событий UPDATE и DELETE. Надо заметить, что в данном примере, в журнал событий попадает имя пользователя СУБД, однако, при желании туда можно записывать и более подробные данные — например имя пользователя CMS. Ведь в триггере есть информация об изменяемой строке таблицы, а из нее почти всегда можно получить ссылку на пользователя который ее создал/изменил. Примечание*При создании более сложных триггеров, если вы пользуетесь phpMyAdmin не старших версий, у вас, скорее всего, возникнут проблемы. Для корректной работы используйте версии старше 2.9.1. **Вообще то, по-хорошему, журнал аудита должен содержать информацию, как о событии, так и о результате. Однако у нас простой триггер — а значит и простой журнал аудита :) Бойко А. C. aka
[ вверх ]
Ваш комментарий к данному материалу будет интересен нам и нашим читателям!
|
|
WWW.COMPROG.RU - 2009-2012 | Designed and Powered by Zaipov Renat | Projects |
|