MapleStory Finger Point Cute Line Smiley Blinking Hello Kitty Angel MapleStory Finger Point

๐Ÿ’Ž DataBase/๐Ÿ’Ž SQL-PL,SQL

[PL/SQL] ํŠธ๋ฆฌ๊ฑฐ trigger

HYEJU01 2024. 7. 3. 13:25

[ํŠธ๋ฆฌ๊ฑฐ]

ํ…Œ์ด๋ธ”์— ๋ถ€์ฐฉํ•œ ํ˜•ํƒœ๋กœ์จ, insert, update, delete ์ž‘์—…์ด ์ˆ˜ํ–‰๋  ๋•Œ ํŠน์ • ์ฝ”๋“œ๊ฐ€ ์ž‘๋™๋˜๋„๋ก ํ•˜๋Š” ๊ตฌ๋ฌธ

= ์—ฐ์‡„์ ์ธ ๋™์ž‘ 

ํŠธ๋ฆฌ๊ฑฐ ์ƒ์„ฑ > ๋ถ€์ฐฉ   > ๋™์ž‘ > DML ์ˆ˜ํ–‰

set SERVEROUTPUT on; -- ์ถœ๋ ฅ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋„๋ก ์˜จ

CREATE OR REPLACE TRIGGER ํŠธ๋ฆฌ๊ฑฐ๋ช…
    AFTER DELETE OR UPDATE --์‚ญ์ œ, ์ˆ˜์ • ์ดํ›„์— ๋™์ž‘
    ON ๋ถ€์ฐฉํ• ํ…Œ์ด๋ธ” 
    FOR EACH ROW -- ๊ฐํ–‰์— ์ ์šฉ
BEGIN
    DBMS_OUTPUT.PUT_LINE('ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ๋™์ž‘ํ•จ'); -- ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ๋ฅผ begin~end์— ๋„ฃ์Œ
END;

 

[ ์ž๋™ ์—ฐ๊ด€  ]

(์ฃผ๋ฌธ <-> ์ƒํ’ˆ)
์ฃผ๋ฌธ์ด ๋“ค์–ด์˜ค๋ฉด ์ƒํ’ˆ์ด ์ค„์–ด๋“ค์–ด์•ผํ•˜๋Š”๋ฐ
์ด๋•Œ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ํ†ตํ•ด์„œ ๊ด€๋ฆฌํ•˜๋ฉด ํŽธํ•˜๊ฒŒ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ
์ฃผ๋ฌธ์‹œ (+ํŠธ๋ฆฌ๊ฑฐ)

 

 


[ํŠธ๋ฆฌ๊ฑฐ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ‚ค์›Œ๋“œ]

 

- :OLD 

= ์ฐธ์กฐ ์ „ ์—ด์˜ ๊ฐ’ (INSERT : ์ž…๋ ฅ ์ „ ์ž๋ฃŒ, UPDATE : ์ˆ˜์ • ์ „ ์ž๋ฃŒ, DELETE : ์‚ญ์ œํ•  ์ž๋ฃŒ)
- :NEW

= ์ฐธ์กฐ ํ›„ ์—ด์˜ ๊ฐ’ (INSERT : ์ž…๋ ฅ ํ•  ์ž๋ฃŒ, UPDATE : ์ˆ˜์ • ๋œ ์ž๋ฃŒ) -  :: ์ธ์„œํŠธ ๋˜๊ธฐ ์ „์— ๊ฐ’์„ ์ž‘์—… ํ›„ ๋ฐ”๊ฟˆ 

 



[AFTERํŠธ๋ฆฌ๊ฑฐ์˜ ๋™์ž‘ ํ˜•ํƒœ]
- ํŠธ๋ฆฌ๊ฑฐ ์ƒ์„ฑ → ํ…Œ์ด๋ธ” ๋ถ€์ฐฉ → ํ…Œ์ด๋ธ”DML์ˆ˜ํ–‰ → ํŠธ๋ฆฌ๊ฑฐ ๋™์ž‘



[์‹œ๋‚˜๋ฆฌ์˜ค]

ํ…Œ์ด๋ธ”์— UPDATE OR DELETE๊ฐ€ ์ˆ˜ํ–‰๋˜๋ฉด ๋ณ„๋„์˜ ๋ฐฑ์—… ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์–ด์„œ ์ด์ „๋‚ด์šฉ์„ ๊ธฐ๋กํ•œ๋‹ค.

-- ์›๋ณธํ…Œ์ด๋ธ”๊ณผ ๋ฐฑ์—…ํ…Œ์ด๋ธ” ์ƒ์„ฑ
CREATE TABLE TBL_USER(
    ID VARCHAR2(20) PRIMARY KEY,
    NAME VARCHAR2(20),
    ADDRESS VARCHAR2(30)
);

CREATE TABLE TBL_USER_BACKUP(
    ID VARCHAR2(20),
    NAME VARCHAR2(20),
    ADDRESS VARCHAR2(30),
    UPDATEDATE DATE DEFAULT SYSDATE,
    M_TYPE CHAR(10), --๋ณ€๊ฒฝํƒ€์ž…
    M_USER VARCHAR2(20) --๋ณ€๊ฒฝํ•œ ์‚ฌ์šฉ์ž
);

 

ํŠธ๋ฆฌ๊ฑฐ์ƒ์„ฑ

-- ํŠธ๋ฆฌ๊ฑฐ์ƒ์„ฑ
CREATE OR REPLACE TRIGGER TRG_USER_BACKUP
    AFTER UPDATE OR DELETE --AFTERํŠธ๋ฆฌ๊ฑฐ
    ON TBL_USER --๋ถ€์ฐฉํ…Œ์ด๋ธ”
    FOR EACH ROW
DECLARE --์‚ฌ์šฉํ•  ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ณณ
    VN_TYPE VARCHAR2(10);
BEGIN
    IF UPDATING THEN -- UPDATING์€ ์‹œ์Šคํ…œ์—์„œ ์ง€์›ํ•˜๋Š” ๊ตฌ๋ฌธ์ค‘ ํ•˜๋‚˜
        VN_TYPE := '์ˆ˜์ •'; --์œ„ ๋ณ€์ˆ˜์— ์ˆ˜์ •์„ ์ €์žฅ
    ELSIF DELETING THEN -- DELETING๋˜์—ˆ๋‹ค๋ฉด
        VN_TYPE := '์‚ญ์ œ';
    END IF;
    --์‹คํ–‰๊ตฌ๋ฌธ์‹œ์ž‘ (:OLD ๋Š” ํ…Œ์ด๋ธ” DELETE, UPDATE๊ฐ€ ์ ์šฉ๋˜๊ธฐ์ „ ๊ธฐ์กด ๋ฐ์ดํ„ฐ. ์ฆ‰ ๋ณ€๊ฒฝ์ „ ๋ฐ์ดํ„ฐ)
    INSERT INTO TBL_USER_BACKUP 
    VALUES(:OLD.ID, :OLD.NAME, :OLD.ADDRESS, SYSDATE, VN_TYPE, USER() );
END;

 

๊ฒฐ๊ณผ์ˆ˜ํ–‰

INSERT INTO TBL_USER VALUES('TEST01', 'ADMIN', '์„œ์šธ');
INSERT INTO TBL_USER VALUES('TEST02', 'ADMIN', '๊ฒฝ๊ธฐ');
INSERT INTO TBL_USER VALUES('TEST03', 'ADMIN', '๋ถ€์‚ฐ');

UPDATE TBL_USER SET ADDRESS = '๋ถ€์‚ฐ' WHERE ID = 'TEST01'; --ํŠธ๋ฆฌ๊ฑฐ๋™์ž‘
DELETE FROM TBL_USER WHERE ID = 'TEST02'; --ํŠธ๋ฆฌ๊ฑฐ๋™์ž‘

 



[BEFOREํŠธ๋ฆฌ๊ฑฐ์˜ ๋™์ž‘ ํ˜•ํƒœ]
- ํŠธ๋ฆฌ๊ฑฐ ์ƒ์„ฑ → ํ…Œ์ด๋ธ” ๋ถ€์ฐฉ → ํŠธ๋ฆฌ๊ฑฐ ๋™์ž‘ → ํ…Œ์ด๋ธ”DML์ˆ˜ํ–‰

 


[์‹œ๋‚˜๋ฆฌ์˜ค]

ํšŒ์› ์ •๋ณด๊ฐ€ ์ž…๋ ฅ๋  ๋•Œ ํšŒ์› ์ด๋ฆ„์„ ๋งˆ์Šคํ‚น ํ•ด์„œ ๋„ฃ๋Š”๋‹ค

-- ํŠธ๋ฆฌ๊ฑฐ ์ƒ์„ฑ
CREATE OR REPLACE TRIGGER TRG_USER_INSERT 
    BEFORE INSERT -- ์ด์ „ ํŠธ๋ฆฌ๊ฑฐ 
    ON TBL_USER
    FOR EACH ROW
BEGIN
    :NEW.NAME := SUBSTR(:NEW.NAME, 1, 1) || '**'; -- ๋งˆ์Šคํ‚น ์ฒ˜๋ฆฌ
END;

 

 

๊ฒฐ๊ณผ์ˆ˜ํ–‰

INSERT INTO TBL_USER VALUES('TEST02', '์ด์ˆœ์‹ ', '๋ถ€์‚ฐ');
INSERT INTO TBL_USER VALUES('TEST03', 'ํ™๊ธธ๋™', '๊ฒฝ๊ธฐ');
INSERT INTO TBL_USER VALUES('TEST04', 'ํ™๊ธธ๋™', '๊ฒฝ๊ธฐ');