#11 Events & Triggers

#11.0 Introduction

Event - database가 해야 할 작업들의 스케줄링 가능

ex) 특정 조건의 row를 특정 요일에 삭제

Trigger - database에서 일어나는 일에 반응 가능

ex) 특정 row 삭제시 삭제에 대한 로그 table 생성

#11.1 Events

CREATE TABLE archived_movies LIKE movies;
-- table 구조 복사

DROP TABLE archived_movies;
TRUNCATE TABLE archived_movies; -- table 모든 내용 삭제

DELIMITER $$ -- 다른 DELIMITER 사용
CREATE EVENT archive_old_movies
ON SCHEDULE EVERY 2 MINUTE
STARTS CURRENT_TIMESTAMP + INTERVAL 2 MINUTE
DO -- 1개는 DO만 사용
BEGIN 
	INSERT INTO archived_movies
  SELECT * FROM movies
  WHERE release_date < YEAR(CURDATE()) - 20;
  
  DELETE FROM movies WHERE release_date < YEAR((CURDATE()) - 20;
END$$
DELIMITER ;

DROP EVENT archive_old_movies;

#11.2 Recap

https://chatgpt.com/share/d5844020-c1d8-46d9-a363-879f3421750f

show events;

show create event ~~~;

#11.3 Triggers

-- before - insert, update, delete 전
-- after - insert, update, delete 후

CREATE TABLE records (
	record_id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  changes tinytext,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL
);

INSERT INTO movies SELECT * FROM archived_movies WHERE movie_id = 2;

-- INSERT
CREATE TRIGGER before_movie_insert
BEFORE INSERT
ON movies
FOR EACH ROW
INSERT INTO records (changes) VALUES (CONCAT('Will Insert', NEW.title));

CREATE TRIGGER after_movie_insert
AFTER INSERT
ON movies
FOR EACH ROW
INSERT INTO records (changes) VALUES (CONCAT( 'Insert completed: ', NEW.TITLE));

-- UPDATE
CREATE TRIGGER before_movie_update
BEFORE UPDATE
ON movies
FOR EACH ROW
INSERT INTO records (changes) VALUES (CONCAT('Will update title: ', OLD.title, ' -> ', NEW.title));

CREATE TRIGGER after_movie_update
AFTER UPDATE
ON movies
FOR EACH ROW
INSERT INTO records (changes) VALUES (CONCAT('update completed: ', OLD.title, ' -> ', NEW.title));

-- DELETE
CREATE TRIGGER before_movie_delete
BEFORE DELETE
ON movies
FOR EACH ROW
INSERT INTO records (changes) VALUE (CONCAT('Will delete: ', OLD.title));

CREATE TRIGGER after_movie_delete
AFTER DELETE
ON movies
FOR EACH ROW
INSERT INTO records (changes) VALUE (CONCAT('Bye : ', OLD.title));

#11.4 Overpowered Trigger

SHOW TRIGGERS;

DROP TRIGGER after_movie_update;


TRUNCATE TABLE records;

DROP TRIGGER after_movie_update;

DELIMITER $$
CREATE TRIGGER after_movie_update
AFTER UPDATE
ON movies
FOR EACH ROW
BEGIN
  DECLARE changes TINYTEXT DEFAULT '';
	
  IF NEW.title <> OLD.title THEN
  	SET changes = CONCAT('Title Changed', OLD.title, '->', NEW.title, '\n ');
  END IF;
  
  IF NEW.budget <> OLD.budget THEN
  	SET changes = CONCAT(changes, 'Budget changed ', OLD.budget, '->', NEW.budget);
  END IF;
  
  INSERT INTO records (changes) VALUES (changes);
  
END$$
DELIMITER ;

Last updated

Was this helpful?