====Тригери=== Тригер – код (блок), який певна подія автоматично запускає на виконання.\\ Створення тригеру – CREATE TRIGGER …\\ Потрібно вказати компоненти:\\ * Типи подій (які підтримує MySQL): INSERT (команди INSERT, REPLACE, LOAD DATA), UPDATE, DELETE (команди INSERT, LOAD DATA), * Момент активації: BEFORE (до) або AFTER (після) події, * Таблицю БД, з якою зв'язаний тригер, * Тіло тригера – код, який виконується. Тригер не можна створювати для таблиць VIEW і TEMPORARY.\\ До одної таблиці можна приєднати декілька тригерів: \\ INSERT BEFORE, INSERT AFTER, UPDATE BEFORE, UPDATE AFTER, DELETE BEFORE, DELETE AFTER. **Приклади створення тригера**\\ CREATE TRIGGER emp_add AFTER INSERT ON emp FOR EACH ROW INSERT INTO log ( ByUser, Note, id, EventTime ) VALUES (CURRENT_USER(), ‘Новий запис: emp’, emp.empno, NOW() ); CREATE TRIGGER dept_add AFTER INSERT ON dept FOR EACH ROW INSERT INTO log( ByUser, Note, id, EventTime ) VALUES (CURRENT_USER(), ‘Новий запис: dept’, dept.deptno, NOW() ); Таблиця log зберігає інформацію про користувачів, які ввели нові дані в таблиці emp та dept: користувач, таблиця, ключ таблиці, коли. Псевдоніми OLD і NEW в тригерах NEW.стовпець (для INSERT, UPDATE), OLD.стовпець (для DELETE, UPDATE) • Тригер може викликати процедуру, що зберігається в БД. • Тригер може звертатись до “старих” даних (до виконання тригеру) і “нових” даних (після виконання тригеру) своєї таблиці. • Через процедуру тригер може також обробляти інші таблиці. DROP TRIGGER <і'мя тригера>; -- видалення тригера. SHOW CREATE TRIGGER <і'мя тригера>; -- перегляд тіла тригера. SHOW TRIGGERS FROM db1 WHERE ‘Table’ = ‘emp’; -- перегляд тригерів таблиці emp. Без WHERE – перелік тригерів для всієї БД db1. Тригер. Приклад CREATE TABLE account (acct_num INT, amount DECIMAL (10,2)); CREATE TRIGGER ins_sum BEFORE INSERT ON account FOR EACH ROW SET @sum = @sum + NEW.amount; Використання тригера SET @sum = 0; INSERT INTO account VALUES(137,14.98),(141,1937.50),(97,-100.00); SELECT @sum AS ‘Сума='; Сума= 1852.48 | Значення @sum після INSERT дорівнює 14.98 + 1937.50 - 100 = 1852.48. Приклад DELIMITER // CREATE TRIGGER upd_check BEFORE UPDATE ON account FOR EACH ROW BEGIN IF NEW.amount < 0 THEN SET NEW.amount = 0; ELSEIF NEW.amount > 100 THEN SET NEW.amount = 100; END IF; END; // DELIMITER ; Приклад Таблиці БД: Countries(id, title) -- країни Cities(id, title, country_id) -- міста (в країнах) Зв’язок між таблицями: Cities.country_id = Countries.id Якщо з БД видаляється країна, то всі міста цієї країни теж видаляються. Це виконує тригер: DELIMITER // CREATE TRIGGER `delete_cities` BEFORE DELETE ON `countries` FOR EACH ROW BEGIN DELETE FROM `cities` WHERE `country_id`=OLD.`id`; END Тригер. Приклад з БД emp_dept CREATE TRIGGER emp_dept.new_empl BEFORE INSERT ON emp FOR EACH ROW BEGIN DECLARE sal_, empno_, mgr_,deptno_, kil, s int; SET mgr_ =new.mgr; SET deptno_ =new.deptno; SET sal_ =new.sal; SELECT COUNT(*) INTO kil FROM emp WHERE deptno_ IN (SELECT deptno FROM dept); IF kil = 0 THEN SIGNAL SQLSTATE '02000' SET MESSAGE_TEXT= 'Помилковий номер відділення!'; END IF; SELECT COUNT(*) INTO kil FROM emp WHERE mgr_ = empno; IF kil = 0 THEN SIGNAL SQLSTATE '02000' SET MESSAGE_TEXT = 'Нема такого начальника!'; END IF; END // Заплановані події – спеціальний вид тригера Заплановані події (event) ініціалізуються в певні моменти часу і запускають на виконання певні коди. Вони пов'язані з конкретними таблицями. CREATE EVENT [IF NOT EXISTS] < і'мя_події> <розклад ініціалізації> <початок дії> [<кінець дії>] ENABLE| DISABLE DO <тіло>; <розклад ініціалізації> = ON SCHEDULE EVERY n {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | WEEK | SECOND} , Початок дії: STARTS <час>, Кінець дії: ENDS <час>. По замовчуванню заплановані події, які описані в команді CREATE EVENT, відключені ( деактивовані). Події активуються командою: SET GLOBAL event_scheduler = ON; деактивувати можна: SET GLOBAL event_scheduler = OFF; ALTER EVENT … ALTER EVENT ev_ DISABLE; (тимчасове) відключення ALTER EVENT ev_ ENABLE; включення DROP EVENT ev_ ; Прогляд всіх запланованих подій SHOW EVENTS; Приклад CREATE TABLE Order_arch LIKE Orders; ALTER TABLE Order_arch ENGINE = ARCHIVE; DELIMITER // CREATE EVENTS Order_acrh ON SCHEDULE EVERY 1 DAY STARTS ‘2017-04-22 23:00:00’ ENABLE DO BEGIN INSERT INTO arh SELECT * FROM Orders WHERE Odate<= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY); DELETE FROM Orders WHERE Odate<= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY); END // Події, які ініціалізуються лише один раз Замість EVERY використовується AT, яке вказує на дату і час ініціалізації події. DELIMITER // CREATE EVENTS log_onetime ON SCHEDULE AT ‘2015-12-31 23:00:00’ ENABLE DO INSERT INTO log (ByUser, Note, EventTime) VALUES (CURRENT_USER(), ‘Повідомлення …’, NOW() ); END // DELIMITER ;