Тригери в MySQL

Тригер – це процедура особливого типу використання якої обумовлено настанням визначеної події (додавання, видалення, оновлення рядочка) у реляційній базі даних.

Тригер не може бути запущений безпосередньо юзером, це і є основною відмінністю тригера від звичайних процедур в MySQL.

Короткий опис синтаксису тригера:

<trigger name> – назва тригера;

Час виконання:

BEFORE – тригер активується перед виконанням інструкції.

AFTER – тиригер активується після виконання інструкції.

Інструкції, які активують тригер:

INSERT – виконується кожного разу при додаванні в таблицю нового рядка відповідними командами INSERT, LOAD DATA і REPLACE.

UPDATE – виконується кожного разу,коли рядочок змінюється відповідною командою UPDATE.

DELETE – виконується кожного разу коли рядочок видаляється відповідними командами DELETE, REPLACE.

Зауваження:

Такі команди як DROP TABLE і TRUNCATE відносно таблиці НЕ будуть активовувати тригер по інструкції DELETE.

Комада REPLACE активує тригери по двох інструкціях DELETE і INSERT у відповідному порядку.

<trigger name> – назва таблиці на яку ставиться тригер;

<triggered SQL statement> – інструкції, які будуть виконуватись після активації тригера. Для виконання декількох інструкцій використовуються оператори BEGIN ... END.

NEW – це посилання на стовпчик нового рядочка, який буде вставленний, або на існуючий рядочок після того як він буде змінений.

OLD – це посилання на стовпчик існуйочого рядочка перед тим як він буде змінений або видалений.

Застосування тригерів:

  • автоматичне обчислення значень похідних стовпців;
  • запобігання виконання недозволених транзакцій БД;
  • виконання складних перевірок з метою захисту даних;
  • підтримка складних обмежень цілісності;
  • реєстрація подій, що відбуваються в базі даних;
  • збирання статистики щодо доступу до таблиць бази даних.

Це не весь перелік застосуваннь тригерів. Варто зауважити, що для написання тригерів MySQL користувач повинен мати привілегію SUPER. Для використання достатньо прав звичайного користувача.

Підсумовуючи дану статтю хотів би навести цікавий приклад застосування тригерів. Розпочну з невеличкого вступу. Не секрет що від взлому сайту ніхто не застрахований. Це трапляється в силу тих чи інших обставин. Після такої неприємності в першу чергу шукається проблемне місце через яке відбувся взлом і яке відповідно виправляється. Наступним кроком є видалення з серверу троянів і вірусів, які заніс зловмисник на даний сервер. Навіть попри те, що на сервері часто стоїть багато різних програм, які видаляють шкідливі програми і віруси, на наш сервер зловмисник може легко потрапити повторно після взлому. Часто ми забуваємо про перевірку тригерів. Здавалось би що поганого може бути в тригерах. Не рідко в тригери можуть бути записані бекдори – це скрипти, які залишають відкритими двері на ваш сервер зловмиснику. Один з таких бекдорів продемонструю на прикладі.

Приклад:

Створити таблицю users де будуть міститися дані користувачів. А саме Id – користувача, який генерується автоматично, Name – ім’я користувача, Pass – пароль користувача, Rol – права користувача. В нашому прикладі буде два види прав: admin (права на створення, редагування і видалення сайту і його вмісту) і user (звичайний користувач, який має права тільки на перегляд вмістимого ). Поле Online може містити лишень два значення 1 (користувач зараз на сайті) і 0 (користувач відсутній на сайті). Цей параметр ставиться користувачеві автоматично коли той заходить і покидає сайт відповідно.

Для даної таблиці створюємо тригер, який буде нашим бекдором.

Задача тригера – змінювати права нашого користувача. Коли наш користувач заходитиме на сайт, його права повинні автоматично змінитись з звичайних ‘user’ на права адміністратора ‘admin’, що дозволить нашому звичайному користувачеві мати доступ до коду сайту. Для того щоб замести сліди після залишення сайту, права нашого користувача повинні повернутись в початковий стан. Нехай наш користувач матиме назву ‘guest’.

Тригер матиме наступний вигляд:

Даний тригер реагуватиме на запити наступного вигляду:

Замітка:

delimiter – ця команда використовується в MySQL для заміни стандартного розділювача ‘;’ . Його часто використовують для написання процедур, функцій і тригерів, які мають складну структуру (мають вкладення з декількох оперецій в одному запиті)

В наведеному прикладі робиться заміна стандартного роділювача ‘;’ на ‘$$’ для того, щоб розділювач ‘;’ можна було використовувати в середині процедури тригера.

Наведений вище приклад бекдора є доволі тривіальним, але тим не менше він надає певну уяву про написання тригерів і застереження щодо того як забезпечети безпеку своїх програмних продуктів.

Доповнення:

Для того, щоб переглянути всі тригери, які присутні в базі даних, можна скористатись наступним запитом:

Корисні посилання по даній темі:

Офіційна документація MySQL.

How to Create Triggers in MySQL

Как правильно писать хранимые процедуры в MySQL с блоком IF/THEN/ELSE внутри

Тригер (бази даних)

Триггеры — спасители

Триггеры в MySQL

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *