Skip to content

Latest commit

ย 

History

History
320 lines (206 loc) ยท 7.74 KB

Trigger.md

File metadata and controls

320 lines (206 loc) ยท 7.74 KB

ํŠธ๋ฆฌ๊ฑฐ (Trigger)

ํŠน์ • ํ…Œ์ด๋ธ”์—์„œ INSERT, DELETE, UPDATE ๊ฐ™์€ DML ๋ฌธ์ด ์ˆ˜ํ–‰๋˜์—ˆ์„๋•Œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ž๋™์œผ๋กœ ๋™์ž‘ํ•˜๋„๋ก ์ž‘์„ฑ๋œ ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค. ํŠธ๋ฆฌ๊ฑฐ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ž๋™์ ์œผ๋กœ ํ˜ธ์ถœํ•œ๋‹ค. DM ๋ฌธ์˜ ์ˆ˜ํ–‰์‹œ, ๋ฌต์‹œ์ ์œผ๋กœ ํ•จ๊ป˜ ์ˆ˜ํ–‰๋˜๋Š” ํ”„๋กœ์‹œ์ €(PROCEDURE) ์ด๋‹ค.


ํŠน์ง•

  1. ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋ฉฐ ์ˆ˜๋™์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋‹ค.

  2. ์–ด๋–ค ๋™์ž‘์—์„œ ์‹คํ–‰๋˜๋Š”์ง€ ์ง€์ •ํ•ด์•ผํ•œ๋‹ค.

  3. ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ํŠธ๋ฆฌ๊ฑฐ ๋‚ด์˜ SQL ๋ช…๋ น๋ฌธ์€ ์ž ์ •์ ์œผ๋กœ ๋‹ค๋ฅธ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

  4. ํŠธ๋ฆฌ๊ฑฐ์˜ ๋™์ž‘ ์˜์—ญ์€ PL/SQL๋กœ ์ž‘์„ฑํ•œ๋‹ค.

  1. ํ•˜๋‚˜์˜ ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ๋‹ค๋ฅธ ํŠธ๋ฆฌ๊ฑฐ ํ˜ธ์ถœ ๋ถˆ๊ฐ€ํ•˜๋‹ค.


ํŠธ๋ฆฌ๊ฑฐ ์ข…๋ฅ˜

ํ–‰ ํŠธ๋ฆฌ๊ฑฐ

  • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ–‰์— ๋Œ€ํ•ด ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ์—ฌ๋Ÿฌ๋ฒˆ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•

  • ํŠธ๋ฆฌ๊ฑฐ ์ƒ์„ฑ์‹œ, [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 ํ‚ค์›Œ๋“œ๋ฅผ ์•Œ์•„๋ณด์ž.


  1. OLD

์˜ˆ์ „์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋งํ•œ๋‹ค.

DELETE๋กœ ์‚ญ์ œ๋œ ๋ฐ์ดํ„ฐ ํ˜น์€ UPDATE๋กœ ๋ฐ”๋€Œ๊ธฐ์ „ ๋ฐ์ดํ„ฐ


  1. 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 ์กฐ๊ฑด] ์„ ๋ช…์‹œํ•˜์ง€ ์•Š์Œ


ํŠธ๋ฆฌ๊ฑฐ ์žฅ์ /๋‹จ์ 

์žฅ์ 

  1. ๋ฐ์ดํ„ฐ ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ์˜ ๊ฐ•ํ™”
  • ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ์ด๋ž€? ์ฐธ๊ณ  ๊ด€๊ณ„์— ์žˆ๋Š” ๋‘ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•ญ์ƒ ์ผ๊ด€๋œ ๊ฐ’์„ ๊ฐ–๋„๋ก ์œ ์ง€๋˜๋Š”๊ฒƒ
  • ํŠธ๋ฆฌ๊ฑฐ๋กœ ์ธํ•ด ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ–ˆ์„ ๊ฒฝ์šฐ, ์ฐธ์กฐ ๋ฌด๊ฒฐ์„ฑ์— ์œ„๋ฐ˜๋˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด์„œ ๋กค๋ฐฑ๋œ๋‹ค.

  1. ์—…๋ฌด ์ฒ˜๋ฆฌ ์ž๋™ํ™” ๊ฐ€๋Šฅ
  • ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๊ฐœ์ž…ํ•˜์ง€ ์•Š๊ณ  ๊ตฌํ˜„๋œ ๊ทœ์น™๋Œ€๋กœ ์•Œ์•„์„œ ์‹คํ–‰๋œ๋‹ค.

  1. ์—ฌ๋Ÿฌ ์ž‘์—…์„ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹จ์ 

  1. ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ๋ณต์žกํ•œ ์ƒํ˜ธ์˜์กด์„ฑ ์•ผ๊ธฐ
  2. ํŠธ๋ฆฌ๊ฑฐ์˜ ์—ฐ์‡„ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅ์„ฑ ์กด์žฌ

** ํŠธ๋ฆฌ๊ฑฐ ์—ฐ์‡„
ํ•˜๋‚˜์˜ ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์ด ํŠธ๋ฆฌ๊ฑฐ ๋‚ด์˜ SQL๋ฌธ์ด ์ˆ˜ํ–‰๋˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋กœ ์ธํ•ด ๋˜ ๋‹ค๋ฅธ ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ํ™œ์„ฑํ™”๋˜๋Š” ๊ฒฝ์šฐ



ํŠธ๋ฆฌ๊ฑฐ ๋ฌธ๋ฒ•

์ž‘๋™ ์‹œ์ 

  1. After : ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์ดํ›„ ํŠธ๋ฆฌ๊ฑฐ ์‹คํ–‰

  2. 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 ์˜ค๋Š˜ ๋‚ ์‹œ ์–ด๋•Œ?


์ •๋ฆฌ

ํŠธ๋ฆฌ๊ฑฐ์˜ ํŠน์ง•, ์žฅ์ /๋‹จ์  ์œ„์ฃผ๋กœ ์ค€๋น„ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค. ํŠธ๋ฆฌ๊ฑฐ์˜ ์‚ฌ์šฉ ๋ฌธ๋ฒ• ๋“ฑ ๋ณด๋‹ค๋Š” ํŠธ๋ฆฌ๊ฑฐ์˜ ์žฅ์ /๋‹จ์ /ํŠน์ง•์„ ํŒŒ์•…ํ•˜์—ฌ ์–ด๋–ค ์ƒํ™ฉ์—์„œ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ• ์ง€๋ฅผ ์ค€๋น„ํ•˜๋Š”๊ฑธ ๊ถŒ์žฅํ•œ๋‹ค.



Reference.

https://blog.naver.com/PostView.nhn?blogId=alcmskfl17&logNo=221859839012

https://limkydev.tistory.com/154

https://m.blog.naver.com/leejongcheol2018/222035608132

https://runcoding.tistory.com/32