[ํธ๋ฆฌ๊ฑฐ]
ํ ์ด๋ธ์ ๋ถ์ฐฉํ ํํ๋ก์จ, 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', 'ํ๊ธธ๋', '๊ฒฝ๊ธฐ');