
โ Event & Trigger
Event
MySQL์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ ๊ธฐ๋ฅ
Database๊ฐ ํด์ผ ํ ์์ ๋ค์ ์ค์ผ์ค๋ง ํ ์ ์๋ค.
ex) ํน์ ์กฐ๊ฑด์ ํด๋น๋๋ row๋ค์ ๋งค์ฃผ ์์์ผ ์คํ 3์์ ์ญ์ ํ๋ค.
PostgreSQL์์๋ ์ง์ํ์ง๋ง ํ์ฅํ๋ก๊ทธ๋จ์ ์ด์ฉํด์ผ ํ๋ค.
SQLite์์๋ ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํ๋ค.
Trigger
Database์์ ์ผ์ด๋๋ ์ผ์ ๋ฐ์ํ ์ ์๋ค.
ex) ๋๊ตฐ๊ฐ๊ฐ row๋ฅผ ์ญ์ ํ๊ธฐ ์ ์ ๊ทธ ์ญ์ ์ ๋ํ log๋ฅผ log ํ ์ด๋ธ์ ๋ง๋ ๋ค.
MySQL, PostgreSQL, SQLite ๋ชจ๋ ์ฌ์ฉ ๊ฐ๋ฅ
๋ฐ์ดํฐ ์์ด ๊ตฌ์กฐ๋ง ๊ทธ๋๋ก ๊ฐ์ ธ์ ํ ์ด๋ธ์ ์์ฑํ๋ ๋ฒ
CREATE TABLE archived_movies LIKE movies;
โ Event
• ๊ด๋ฆฌ
โซ ์ด๋ฒคํธ๋ฅผ ๋ณด๋ ค๋ฉด: `SHOW EVENTS;`
โซ ์ด๋ฒคํธ๋ฅผ ์ญ์ ํ๋ ค๋ฉด: `DROP EVENT ์ด๋ฒคํธ์ด๋ฆ;`
โซ ์ด๋ฒคํธ ์ค์ผ์ค๋ฌ๊ฐ ์ผ์ ธ ์์ด์ผ ๋์ํฉ๋๋ค: SET GLOBAL event_scheduler = ON;
Event ์์ฑ
CREATE EVENT archived_old_movies ON schedule EVERY 2 DAY;
DAY ๋ถ๋ถ์๋ MINUTE, WEEK, YEAR, MONTH ๋ฑ ๋ค์ํ๊ฒ ๋ค์ด๊ฐ ์ ์๋ค.
CREATE EVENT archived_old_movies ON schedule EVERY 2 MINUTE DO
INSERT INTO
archived_movies
SELECT
*
FROM
movies
WHERE
release_date < YEAR(CURDATE()) - 20;
20๋ ์ ์ํ๋ค๋ง ๊ณจ๋ผ์ 2๋ถ๋ง๋ค archived_movies TABLE์ ๋ฃ๊ธฐ
Table์ DROP ์ํค์ง ์๊ณ ๋ด์ฉ๋ง ์ ๋ถ ์ง์ฐ๋ ๋ฐฉ๋ฒ(TRUNCATE)
TRUNCATE TABLE archived_movies;
Event ๋ด์์ statement๊ฐ 2๊ฐ ์ด์์ด๋ฉด BEGIN๊ณผ END๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค
CREATE EVENT archived_old_movies ON SCHEDULE EVERY 2 MINUTE starts CURRENT_TIMESTAMP + INTERVAL 2 MINUTE 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;
DO๋ง ์ฌ์ฉํ๋ ๊ฒ์ ์ค์ง statement๊ฐ 1๊ฐ์ผ ๋.
๊ทธ๋ฐ๋ฐ ์ ์ฝ๋๋ ์ ์ ๋์์ด ๋์ง ์๋๋ค.
EVENT ๋ด์์ ์ฒซ ๋ฒ์งธ WHERE ์ ๊น์ง๊ฐ ํ๋์ ๋ช ๋ น์ด๋ก ๋ณด๊ธฐ ๋๋ฌธ.
Delimiter
Database์๊ฒ SQL statement๊ฐ ๋๋ฌ๋ค๊ณ ์๋ ค์ฃผ๋ ๋ฌธ์(;)
์ ์ฝ๋๋ฅผ ๋ณด๋ฉด BEGIN, END ๋ธ๋ก ๋ด์ delimiter๊ฐ 2๊ฐ๋ผ์ SQL์ด ํท๊ฐ๋ คํ๋ค.
DELIMITER $$
CREATE EVENT archived_old_movies ON SCHEDULE EVERY 2 MINUTE starts CURRENT_TIMESTAMP + INTERVAL 2 MINUTE 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 ;
DELIMITER ํค์๋๋ก $$๋ฅผ DELIMITER๋ก ์ฌ์ฉํ๋ค๊ณ ์ง์ ํ๊ณ , END๋ถ๋ถ์์ ์ฌ์ฉํ ๋ค ๋ค์ ;๋ก DELIMITER๋ฅผ ๋ฐ๊พผ๋ค.
DELIMITER๋ก ์ง์ ํ delimiter๋ EVENT ๋ด๋ถ๊ฐ ์๋ ์ธ๋ถ์ ์ ์ฉ๋๋ค.
Event Scheduling Options
https://chatgpt.com/share/d5844020-c1d8-46d9-a363-879f3421750f
โ Trigger
Trigger์๋ 2์ข ๋ฅ๊ฐ ์๋ค.
1. Before Trigger
2. After Trigger
Trigger ์์ฑํ๋ ๋ฒ
CREATE TRIGGER before_movie_insert BEFORE
INSERT
ON movies FOR EACH ROW
INSERT INTO
records (changes)
VALUES
(CONCAT('Will insert', NEW.title));
movies table์ ๋ชจ๋ row์ ๋ํ์ฌ insert๊ฐ ์ผ์ด๋๊ธฐ ์ ์ ์๋ก insert๋๋ movie data์ title์ rocords table์ changes column์ insertํ๋ค.
NEW, OLD
insertํ ๋ NEW.title์ฒ๋ผ NEW๋ก ์๋ก ์ถ๊ฐ ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐธ์กฐํ ์ ์๊ณ ,
updateํ ๋๋ OLD.title์ฒ๋ผ OLD๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ฐ์ดํธ ๋๊ธฐ ์ ๊ธฐ์กด ๋ฐ์ดํฐ๋ฅผ ์ฐธ์กฐํ ์ ์๋ค.
CREATE TABLE records (record_id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, changes TINYTEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL);
CREATE TRIGGER before_movie_delete BEFORE
DELETE ON movies FOR EACH ROW
INSERT INTO
records (changes)
VALUES
(CONCAT('Will delete: ', OLD.title));
CREATE TRIGGER after_movie_delete AFTER DELETE ON movies FOR EACH ROW
INSERT INTO
records (changes)
VALUES
(CONCAT('Bye Bye: ', OLD.title));
INSERT INTO
movies
SELECT
*
FROM
archived_movies
WHERE
movie_id = 2;
Trigger๋ฅผ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค.
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 ;
TRUNCATE TABLE records;
DROP TRIGGER after_movie_update;
DECLARE๋ ๋ณ์ ์ ์ธ ํค์๋
<>๋ != ์ ํ์ค SQL ํํ์ด๋ค.
!= ๋ ์ผ๋ถ DBMS์์ ์ง์
'๐งฉ SQL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| SQL - PostgreSQL ์ค์น(๊ณต์ ์ฌ์ดํธ, Homebrew) (0) | 2026.04.01 |
|---|---|
| SQL - MySQL, Full Text Index (0) | 2026.03.31 |
| SQL - MySQL, UNION (0) | 2026.03.27 |
| SQL - MySQL, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทํ, Foreign Key, JOIN (0) | 2026.03.25 |
| SQL - MySQL, ๋ฌธ๋ฒ (0) | 2026.03.24 |