ํน์ ํ ์ด๋ธ์์ INSERT, DELETE, UPDATE ๊ฐ์ DML ๋ฌธ์ด ์ํ๋์์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์๋์ผ๋ก ๋์ํ๋๋ก ์์ฑ๋ ํ๋ก๊ทธ๋จ์ด๋ค. ํธ๋ฆฌ๊ฑฐ๋ ์ฌ์ฉ์๊ฐ ์ง์ ํธ์ถํ๋ ๊ฒ์ด ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์๋์ ์ผ๋ก ํธ์ถํ๋ค. DM ๋ฌธ์ ์ํ์, ๋ฌต์์ ์ผ๋ก ํจ๊ป ์ํ๋๋ ํ๋ก์์ (PROCEDURE) ์ด๋ค.
ํน์ง
-
์๋์ผ๋ก ์คํ๋๋ฉฐ ์๋์ผ๋ก ์คํํ ์ ์๋ค.
-
์ด๋ค ๋์์์ ์คํ๋๋์ง ์ง์ ํด์ผํ๋ค.
-
ํธ๋ฆฌ๊ฑฐ๋ฅผ ์คํํ ๋ ํธ๋ฆฌ๊ฑฐ ๋ด์ SQL ๋ช ๋ น๋ฌธ์ ์ ์ ์ ์ผ๋ก ๋ค๋ฅธ ํธ๋ฆฌ๊ฑฐ๋ฅผ ์คํํ ์ ์๋ค.
-
ํธ๋ฆฌ๊ฑฐ์ ๋์ ์์ญ์ PL/SQL๋ก ์์ฑํ๋ค.
- ํ๋์ ํธ๋ฆฌ๊ฑฐ๊ฐ ์ข ๋ฃ๋์ง ์์ ์ํ์์ ๋ค๋ฅธ ํธ๋ฆฌ๊ฑฐ ํธ์ถ ๋ถ๊ฐํ๋ค.
-
์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ฌ๋ฌ๊ฐ์ ํ์ ๋ํด ํธ๋ฆฌ๊ฑฐ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ์ฌ๋ฌ๋ฒ ์ํํ๋ ๋ฐฉ๋ฒ
-
ํธ๋ฆฌ๊ฑฐ ์์ฑ์, [FOR EACH ROW WHEN ์กฐ๊ฑด] ์ ๋ช ์
-
๋ณ๊ฒฝ ํ์ ํ์ OLD, NEW ๋ฅผ ํตํด ๊ฐ์ ธ์ฌ ์ ์๋ค. (ํค์๋๋ ๋ฐ๋ก ์๋ ์ฐธ๊ณ )
-- test ํ
์ด๋ธ์ insert ๊ฐ ๋๋ฉด BEGIN~END ๋ก์ง์ ์ํํ๋ค.
-- for each row : ํ 1๊ฐ๊ฐ insert ๋ ๋๋ง๋ค ํ๋ฒ์ฉ ์คํ๋๋ค.
create or replace trigger test_insert_trigger
after insert on test
for each row
BEGIN
insert into test_history(no, pname)
values(:NEW.no ,:NEW.pname);
END;
์ฌ๊ธฐ์ OLD, NEW ํค์๋๋ฅผ ์์๋ณด์.
- OLD
์์ ์ ๋ฐ์ดํฐ๋ฅผ ๋งํ๋ค.
DELETE๋ก ์ญ์ ๋ ๋ฐ์ดํฐ ํน์ UPDATE๋ก ๋ฐ๋๊ธฐ์ ๋ฐ์ดํฐ
- NEW
์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ๋งํ๋ค.
INSERT๋ก ์ฝ์ ๋ ๋ฐ์ดํฐ ํน์ UPDATE๋ก ๋ฐ๋ ํ ๋ฐ์ดํฐ
-
DML ๋ฌธ์ ๋ํด์ ํ๋ฒ๋ง ์คํ๋๋ค.
-
ํธ๋ฆฌ๊ฑฐ๊ฐ ์์ฑ๋ ํ ์ด๋ธ์ ํธ๋ฆฌ๊ฑฐ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ๋ง์ ํ์ ๋ํด ๋ณ๊ฒฝ ์์ ์ด ๋ฐ์ํ๋๋ผ๋, ์ค์ง ํ๋ฒ๋ง ํธ๋ฆฌ๊ฑฐ๋ฅผ ๋ฐ์์ํค๋ ๋ฐฉ๋ฒ์ด๋ค.
-
์ปฌ๋ผ๊ฐ์ด ๋ณํ๊ฐ ์๊ธธ๋๋ง๋ค ์ค์ค๋ก ์์์ ์คํ๋๋ค.
-- ๋ฌธ์ฅ ํธ๋ฆฌ๊ฑฐ๋ FOR EACH ROW ๊ฐ ์๋ค.
-- ํ๋์ DML๋ฌธ์ด ์ํ๋์์๋ ์๋ ํธ๋ฆฌ๊ฑฐ๋ ํ๋ฒ๋ง ์ํ๋๋ค.
-- ์๋ ์์ ์์๋ INSERT, UPDATE, DELETE ๊ฐ ์ํ๋๊ณ ,
-- INSERTING, UPDATING, DELETING ํจ์๋ฅผ ํตํด ์ํ๋ DML๋ฌธ์ ๋ฐ๋ผ ๋ฌธ๊ตฌ๋ฅผ ์ถ๋ ฅํ๋ค. (ํ๋ฒ๋ง ์ถ๋ ฅ)
-- INSERTING, UPDATING, DELETING : ์ด๋ค DML๋ฌธ์ด ์ํ๋์๋์ง์ ๋ํ ์ฌ๋ถ๋ฅผ ์์ ์๋ค.
CREATE OR REPLACE TRIGGER TR_Message
AFTER INSERT OR UPDATE OR DELETE ON tCity
BEGIN
IF INSERTING THEN
DBMS_OUTPUT.PUT_LINE('์๋ก์ด ๋์๋ฅผ ์ฝ์
ํ์์ต๋๋ค.');
END IF;
IF UPDATING THEN
DBMS_OUTPUT.PUT_LINE('๋์ ์ ๋ณด๋ฅผ ๊ฐฑ์ ํ์์ต๋๋ค.');
END IF;
IF DELETING THEN
DBMS_OUTPUT.PUT_LINE('๋์๋ฅผ ์ญ์ ํ์์ต๋๋ค.');
END IF;
END;
- ํธ๋ฆฌ๊ฑฐ ์์ฑ์, [FOR EACH ROW WHEN ์กฐ๊ฑด] ์ ๋ช ์ํ์ง ์์
์ฅ์
- ๋ฐ์ดํฐ ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ์ ๊ฐํ
- ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ์ด๋? ์ฐธ๊ณ ๊ด๊ณ์ ์๋ ๋ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ํญ์ ์ผ๊ด๋ ๊ฐ์ ๊ฐ๋๋ก ์ ์ง๋๋๊ฒ
- ํธ๋ฆฌ๊ฑฐ๋ก ์ธํด ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ๋ฐ์ํ์ ๊ฒฝ์ฐ, ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ์ ์๋ฐ๋๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด์ ๋กค๋ฐฑ๋๋ค.
- ์ ๋ฌด ์ฒ๋ฆฌ ์๋ํ ๊ฐ๋ฅ
- ์ฌ์ฉ์๊ฐ ์ง์ ๊ฐ์ ํ์ง ์๊ณ ๊ตฌํ๋ ๊ท์น๋๋ก ์์์ ์คํ๋๋ค.
- ์ฌ๋ฌ ์์ ์ ํ๋์ ํธ๋์ญ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค.
๋จ์
- ํธ๋ฆฌ๊ฑฐ๋ฅผ ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ๋ฉด ๋ณต์กํ ์ํธ์์กด์ฑ ์ผ๊ธฐ
- ํธ๋ฆฌ๊ฑฐ์ ์ฐ์ ์ํ ๊ฐ๋ฅ์ฑ ์กด์ฌ
** ํธ๋ฆฌ๊ฑฐ ์ฐ์
ํ๋์ ํธ๋ฆฌ๊ฑฐ๊ฐ ํ์ฑํ๋์ด ์ด ํธ๋ฆฌ๊ฑฐ ๋ด์ SQL๋ฌธ์ด ์ํ๋๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ก ์ธํด ๋ ๋ค๋ฅธ ํธ๋ฆฌ๊ฑฐ๊ฐ ํ์ฑํ๋๋ ๊ฒฝ์ฐ
์๋ ์์
-
After : ์ด๋ฒคํธ ๋ฐ์ ์ดํ ํธ๋ฆฌ๊ฑฐ ์คํ
-
Before : ์ด๋ฒคํธ ๋ฐ์ ์ด์ ํธ๋ฆฌ๊ฑฐ ์คํ
CREATE [ OR REPLACE ] TRIGGER trigger_name
[AFTER/BEFORE] [์ด๋ฒคํธ1] [OR ์ด๋ฒคํธ2] โฆโฆ
ON table_name
[ FOR EACH ROW ] -- ํํธ๋ฆฌ๊ฑฐ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ , DML์ ์ํฅ์ ๋ฐ๋ ๋ ์ฝ๋๋ง๋ค ํธ๋ฆฌ๊ฑฐ๋์
[WHEN ์กฐ๊ฑด]
DECLARE
-- ์ ์ธ๋ถ
BEGIN
-- ํธ๋ฆฌ๊ฑฐ ์คํ ์ฝ๋
EXCEPTION
END;
--์ฃผ๋ง ์ค์ 10์์์ ์คํ 6์ ์ฌ์ด EMP ํ
์ด๋ธ์ DML ์ฌ์ฉ๋ชปํ๊ฒ ํ๋ ํธ๋ฆฌ๊ฑฐ
--์๋๋ ๋ช
๋ น๋ฌธ ํธ๋ฆฌ๊ฑฐ, ์ฌ๋ฌ๊ฑด์ด DML์ ์ํฅ์ ๋ฐ๋๋ผ๋ ํ๋ฒ๋ง ์คํ
--[FOR EACH ROW] ์์ผ๋ฏ๋ก ๋ฌธ์ฅ ํธ๋ฆฌ๊ฑฐ๋ผ๊ณ ๋ณผ ์ ์๋ค.
SQL> create or replace trigger chk_emp_dml
before insert or update or delete on emp
begin
if (
(to_char(sysdate,'DY') in ('ํ ','์ผ')) AND
(to_number(to_char(sysdate,'HH24'))) >= 10 AND
(to_number(to_char(sysdate,'HH24'))) <= 18) THEN
raise_application_error(-20001,'์ฃผ๋ง๋ณ๊ฒฝ๋ถ๊ฐํฉ๋๋ค.');
end if;
end;
ํธ๋ฆฌ๊ฑฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํด ์๋ ํธ์ถ๋์ง๋ง ๊ฒฐ๊ตญ INSERT, UPDATE, DELETE ๊ตฌ๋ฌธ๊ณผ ํ๋์ ํธ๋์ญ์ ์์์ ์ผ์ด๋๋ ์ผ๋ จ์ ์์ ๋ค์ด๋ค. ์ฌ๋ฌ๊ฐ์ง ์์ ์ ํ๋์ ํธ๋์ญ์ ์ผ๋ก ๋ฌถ์ด์ ์คํํด์ผํ ๋ ํธ๋ฆฌ๊ฑฐ๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ค.
ํธ๋ฆฌ๊ฑฐ ์ํ์ค ์๋ฌ ๋ฐ์์, ์ํ๋ ์ด์ ์ DML๋ฌธ๊น์ง ๋ชจ๋ ๋กค๋ฐฑ๋๋ค.
ํ ์ด๋ธ ์์ฑ
CREATE TABLE chat(
id VARCHAR(32),
answer VARCHAR(32) NOT NULL
);
CREATE TABLE chatBackup(
idBackup VARCHAR(32),
answerBackup VARCHAR(32) NOT NULL
);
INSERT INTO chat VALUE ('pigg', '์๋
');
INSERT INTO chat VALUE ('lemon', '๋ฐ๊ฐ์');
INSERT INTO chat VALUE ('pigg', '์ค๋ ๋ ์จ ์ด๋?');
INSERT INTO chat VALUE ('lemon', '๋ ์จ ์ข์');
-- [์ถ์ฒ] [MySQL] ํธ๋ฆฌ๊ฑฐ(Trigger)์ ํ์ฉ|์์ฑ์ ํผ๋
์ ๋ฐ์ดํฐ ๊ฒฐ๊ณผ
- chat ํ ์ด๋ธ
id | answer |
---|---|
pigg | ์๋ |
lemon | ๋ฐ๊ฐ์ |
pigg | ์ค๋ ๋ ์จ ์ด๋? |
lemon | ๋ ์ ์ข์- |
ํธ๋ฆฌ๊ฑฐ ์์ฑ
- ํธ๋ฆฌ๊ฑฐ ๋ฐ๋ ์กฐ๊ฑด : chat ํ ์ด๋ธ ๋ฐ์ดํฐ DELETE (BEFORE DELETE ON chat)
DELIMITER $$
CREATE TRIGGER autoBackup
BEFORE DELETE ON chat
FOR EACH ROW
BEGIN
DECLARE idTemp VARCHAR(32);
DECLARE answerTemp VARCHAR(32);
SET idTemp = OLD.id;
SET answerTemp = OLD.answer;
INSERT INTO chatBackup VALUE (idTemp, answerTemp);
END $$
DELIMITER ;
-- [์ถ์ฒ] [MySQL] ํธ๋ฆฌ๊ฑฐ(Trigger)์ ํ์ฉ|์์ฑ์ ํผ๋
ํธ๋ฆฌ๊ฑฐ ์์ฑ ํ์ธ
SHOW TRIGGERS;
ํธ๋ฆฌ๊ฑฐ๋ฅผ ๋ฐ๋์์ผ๋ณด์.
DELETE FROM chat WHERE id='pigg';
ํธ๋ฆฌ๊ฑฐ๊ฐ ์ํ๋ ์ดํ ๊ฒฐ๊ณผ๋ฅผ ์กฐํํด๋ณด์.
SELECT * FROM chatbackup;
๊ฒฐ๊ณผ
- chatbackup ํ ์ด๋ธ
idBackup | answerBackup |
---|---|
pigg | ์๋ |
pigg | ์ค๋ ๋ ์ ์ด๋? |
ํธ๋ฆฌ๊ฑฐ์ ํน์ง, ์ฅ์ /๋จ์ ์์ฃผ๋ก ์ค๋นํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค. ํธ๋ฆฌ๊ฑฐ์ ์ฌ์ฉ ๋ฌธ๋ฒ ๋ฑ ๋ณด๋ค๋ ํธ๋ฆฌ๊ฑฐ์ ์ฅ์ /๋จ์ /ํน์ง์ ํ์ ํ์ฌ ์ด๋ค ์ํฉ์์ ํธ๋ฆฌ๊ฑฐ๋ฅผ ์ฌ์ฉํด์ผํ ์ง๋ฅผ ์ค๋นํ๋๊ฑธ ๊ถ์ฅํ๋ค.
https://blog.naver.com/PostView.nhn?blogId=alcmskfl17&logNo=221859839012
https://limkydev.tistory.com/154