Felhasználói eszközök

Eszközök a webhelyen


mysql:my-9

Тригери

Тригер – код (блок), який певна подія автоматично запускає на виконання.
Створення тригеру – 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 ;

mysql/my-9.txt · Utolsó módosítás: 2021/08/13 17:40 szerkesztette: holovacs