Слайд 2Тригер як вид збереженої процедури
Тригер – це збережена процедура особливого
типу, яку користувач не викликає особисто, а використання якої обумовлено
настанням визначеної події у реляційній базі даних.
Тригери застосовуються для забезпечення цілісності даних і реалізації складної бізнес-логіки.
Тригер запускається сервером автоматично при спробі зміни даних у таблиці, з якою він пов'язаний.
Всі здійснені ним модифікації даних розглядаються як виконані в транзакції, в якій виконано дію, що викликало спрацьовування тригера. Відповідно, у разі виявлення помилки або порушення цілісності даних може відбутися відкат цієї транзакції.
Створює тригер тільки власник бази даних. Це обмеження дозволяє уникнути випадкової зміни структури таблиць, способів зв'язку з ними інших об'єктів і т.д.
Не можна створювати тригери для представлень і тимчасових таблиць!
Слайд 3Використання тригерів
автоматичне обчислення значень похідних стовпців;
запобігання виконанню недозволених транзакцій;
виконання складних
перевірок з метою захисту даних;
підтримка складних обмежень цілісності;
реєстрація подій, що
відбуваються в БД;
підтримка реплікації (синхронізації вмісту декількох копій);
збирання статистики щодо доступу до таблиць БД.
Слайд 4Загальний синтаксис створення тригера
CREATE
[DEFINER = { user | CURRENT_USER
}]
TRIGGER
FOR EACH ROW
<тіло тригера>
Час спрацювання тригера: { BEFORE | AFTER }
Подія тригера: { INSERT | UPDATE | DELETE }
Слайд 5Приклад створення тригера
Приклад 1. Після видалення інформації про продавця встановити
значення NULL у полях snum таблиць Customers та Orders, які
відповідали його номеру:
CREATE TRIGGER Sal_dlt
AFTER DELETE ON Sellers
FOR EACH ROW BEGIN
UPDATE Customers SET snum = NULL
WHERE Sellers.snum = Customers.snum;
UPDATE Orders SET snum = NULL
WHERE Sellers.snum = Orders.snum;
END;
Слайд 6Типи тригерів
Тригери DML. Їх виконання відбувається при виконанні для таблиці
будь-якого оператора мови маніпулювання даними (DML).
Тригери DDL. Спрацьовують у відповідь
на ряд подій мови визначення даних (DDL). Ці події насамперед відповідають інструкціям SQL CREATE, ALTER, DROP і деяким системним збереженим процедурам, які виконують схожі з DDL операції (не підтримуються в MySQL).
Тригери входу можуть спрацьовувати у відповідь на подію LOGON, що виникає при установці користувальницьких сеансів (не підтримуються в MySQL).
Слайд 7Тригери DML
Для створення тригера DML потрібен дозвіл ALTER на таблицю,
для якої створюється тригер.
Існує два параметри, що визначають поведінку тригерів:
AFTER.
Тригер виконується після успішного виконання команд, що його викликали. Якщо ж команди з якої-небудь причини не можуть бути успішно завершені, тригер не виконується. Слід зазначити, що зміни даних в результаті виконання запиту користувача і виконання тригера здійснюється в тілі однієї транзакції: якщо відбудеться відкат тригера, то будуть відхилені і зміни користувача.
BEFORE. Тригер викликається перед виконанням команд.
Слайд 8Тригери розрізняють за типом команд, на які вони реагують:
INSERT TRIGGER
– запускаються при спробі додання даних за допомогою команди INSERT.
UPDATE
TRIGGER – запускаються при спробі зміни даних за допомогою команди UPDATE.
DELETE TRIGGER – запускаються при спробі видалення даних за допомогою команди DELETE.
При створенні тригера обов'язково має бути вказана одна із цих команд!
В MySQL допускається створення тригера, що реагує лише на одну команду.
Слайд 9Обмеження тригерів
Інструкція CREATE TRIGGER має бути першою інструкцією в пакеті
і може застосовуватися тільки до однієї таблиці.
Якщо для уточнення тригера
вказано ім'я схеми, то ім'я таблиці необхідно уточнити таким же чином.
Усередині тригера може бути використана будь-яка інструкція SET. Обраний параметр SET залишається в силі під час виконання тригера, після чого настройки повертаються в попередній стан.
Під час спрацьовування тригера результати повертаються користувачу, що викликав тригер так само, як і у випадку з збереженими процедурами. Щоб запобігти викликане спрацьовуванням тригера повернення результатів не слід включати інструкції SELECT, які повертають результат.
Слайд 10Видалення тригера
Для видалення тригера існує команда DROP TRIGGER.
В MySQL не
можливо модифікувати створений тригер! Для цього його необхідно видалити і
створити знову.
Слайд 11Недоліки використання тригерів
складність: при переміщенні деяких функцій в базу даних
ускладнюються завдання її проектування, реалізації та адміністрування;
прихована функціональність: перенесення частини
функцій в базу даних і збереження їх у вигляді одного або декількох тригерів іноді призводить до приховування від користувача деяких функціональних можливостей. Хоча це певною мірою спрощує його роботу, але, на жаль, може стати причиною незапланованих, потенційно небажаних і шкідливих побічних ефектів, оскільки в цьому випадку користувач не в змозі контролювати всі процеси, що відбуваються в базі даних;
вплив на продуктивність: перед виконанням кожної команди по зміні стану бази даних СУБД повинна перевірити тригерну умову з метою з'ясування необхідності запуску тригера для цієї команди. Виконання подібних обчислень позначається на загальній продуктивності СУБД, а в моменти пікового навантаження її зниження може стати особливо помітним. Очевидно, що при зростанні кількості тригерів збільшуються і накладні витрати, пов'язані з такими операціями.
Слайд 12Завдання 1. Написати тригери для власної бази даних
Створити 1 нову
таблицю із 3 полями (ідентифікатор, дата та інформація про модифікацію).
Для
однієї із таблиць бази даних написати 3 AFTER-тригери для кожного типу команд, які після виконання цих команд будуть робити запис у попередню створену таблицю про дату виконання команди та її зміст.
Написати 1 BEFORE-тригер для будь-якої таблиці бази даних, який перед оновленням або доданням даних у цю таблицю буде перевіряти їх відповідність певній умові.