CREATE OR REPLACE TRIGGER trigger_name
BEFORE|AFTER [INSERT|UPDATE|DELETE] ON table_name
DECLARE
๋ณ์ ์ ์ธ => ๋ณ์๊ฐ ์์ผ๋ฉด ์๋ต
BEGIN
ํธ๋ฆฌ๊ฑฐ ๊ตฌํ
END;
ํธ๋ฆฌ๊ฑฐ์ ๊ฐ๋
- ํธ๋ฆฌ๊ฑฐ๋ ํ๋ก์์ ์ ์ ์ฌํ์ง๋ง ์คํ๋๋ ์๋ฆฌ๊ฐ ๋ค๋ฅด๋ค
- ํ๋ก์์ ๋ ์์ฑ ํ EXECUTE / EXEC ๋ช ๋ น์ด๋ฅผ ํตํด์ ์ง์ ์คํํ์ง๋ง
ํธ๋ฆฌ๊ฑฐ๋ ์ด๋ค ์ด๋ฒคํธ ( ์ฃผ๋ก DML ) ๊ฐ ๋ฐ์ํ์ ๋ '๋ด๋ถ์ '์ผ๋ก ์คํ๋๋ ์ ์ฅ๋ ํ๋ก์์ ์ด๋ค.
ํธ๋ฆฌ๊ฑฐ์ ํน์ง
- ํ๋ก์์ ์ ํํ์ด์ง๋ง ๋จ๋ ์ผ๋ก ์ฌ์ฉ๋๊ธฐ ๋ณด๋ค DML ๊ตฌ๋ฌธ์ ๋ถ์ฌ์ ์ฌ์ฉ ๋๋ค
ํธ๋ฆฌ๊ฑฐ์ ์ข ๋ฅ
- AFTER ํธ๋ฆฌ๊ฑฐ : DML ๋ฑ์ ์์ ์ด ์ผ์ด๋ฌ์ ๋ ์๋ํ๋ ํธ๋ฆฌ๊ฑฐ, ํด๋น ์์ ํ์ ์๋ํ๋ค
-BEFORE ํธ๋ฆฌ๊ฑฐ : DML ๋ฑ์ ์์ ์ด ์ผ์ด๋ฌ์ ๋ ์๋ํ๋ ํธ๋ฆฌ๊ฑฐ, ํด๋น ์์ ์ง์ ์ ์๋ํ๋ค
ํธ๋ฆฌ๊ฑฐ ์ฌ์ฉ ์์ (INSERT)
๋ค์์ AFTER ํธ๋ฆฌ๊ฑฐ์ ํ ์์ ์ด๋ค.
๋ฐ์ดํฐ๋ฅผ dept_orgin ํ ์ด๋ธ์ ์ ๋ ฅํ ๋, dept_copy ํ ์ด๋ธ์๋ ์ ๋ ฅํ๋ ํธ๋ฆฌ๊ฑฐ์ด๋ค.
CREATE OR REPLACE TRIGGER trigger_sample1
AFTER INSERT -- afterํธ๋ฆฌ๊ฑฐ INSERT ์ดํ์ ~ (DML๋ฌธ)
ON dept_orgin -- ์ด๋์? dept_orgin ํ
์ด๋ธ์์
for each row -- ๊ฐ ํ๋ง๋ค
BEGIN
IF inserting then -- ๋ง์ฝ์ inserting ์ด ๋ฐ์ํ๋ฉด ~
dbms_output.put_line('Insert Trigger ๋ฐ์');
.
.
.
END IF;
END;
ํธ๋ฆฌ๊ฑฐ ๊ตฌํ๋ถ์์ ์๋ผ์ ๊ฐ์ :NEW ์์ ํ ์ด๋ธ์ ๊ฐ๋ ์ด ๋ฑ์ฅํ๋๋ฐ, ์๋ ์๋ฆฌ๋ ์๋ ๊ทธ๋ฆผ์ ์ฐธ๊ณ ํ๋ฉด ๋๋ค.
:NEW ํ ์ด๋ธ
INSERT์ UPDATE ์์ ์์ ๋ณ๊ฒฝํ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์ ๊น ์ ์ฅํด ๋๋ ์์ ํ ์ด๋ธ์ด๋ค.
:OLD ํ ์ด๋ธ
DELETE ์์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ๊น ์ ์ฅํด ๋๋ ์์ ํ ์ด๋ธ์ด๋ค.
insert into dept_copy
values(:new.dno, :new.dname, :new.loc);
END IF;
๊ทธ๋ผ INSERT ๋ฌธ์ผ๋ก dept_orgin ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅ ํ ์กฐํํด๋ณด์.
INSERT INTO dept_orgin VALUES(10, 'ACCOUNTING', 'NEW YORK');
SELECT * FROM dept_orgin;
SELECT * FROM dept_copy;
์กฐํ๊ฒฐ๊ณผ
dept_orgin ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํ์ ๋ณ๋์ ์คํ๋ฌธ ์์ด AFTER ํธ๋ฆฌ๊ฑฐ (INSERT)๊ฐ ์คํ ๋์ด dept_copy ํ ์ด๋ธ์๋ ๋ฐ์ดํฐ๊ฐ ์ ๋ ฅ๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ค.
ํธ๋ฆฌ๊ฑฐ ์ฌ์ฉ ์์ (UPDATE & DELETE)
๋ค์์ AFTER ํธ๋ฆฌ๊ฑฐ UPDATE & DELETE ์ ์์ ์ด๋ค.
์ ๋ ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฑฐ๋ ์ญ์ ํ ๋ ๋ฐ์๋๋ ํธ๋ฆฌ๊ฑฐ๋ฅผ ๊ตฌํํ๋๋ฐ dept_copy ํ ์ด๋ธ์ ์์ /์ญ์ ๋ฅผ ํ์(์ ๋ ฅ)
ํ๊ธฐ ์ํ ์ปฌ๋ผ์ ํ๋ ์ถ๊ฐํ๊ณ ์์ ๋ฅผ ์งํํ๋ค. (์ปฌ๋ผ ์ถ๊ฐ ์คํฌ๋ฆฝํธ๋ ์๋ต.)
CREATE OR REPLACE TRIGGER trigger_sample2
AFTER UPDATE OR DELETE
ON dept_orgin
for each row
DECLARE
v_modType NCHAR(2);
BEGIN
.
.
.
.
END;
์ด์ ํธ๋ฆฌ๊ฑฐ ๊ตฌํ๋ถ๋ฅผ ์์ฑํ ์ฐจ๋ก์ธ๋ฐ ์์์ ์ค๋ช ํ :OLD ์์ ํ ์ด๋ธ์ ๊ฐ๋ ์ด ๋ฑ์ฅํ๋ค.
IF updating then
dbms_output.put_line('updating Trigger ๋ฐ์');
v_modType := '์์ ';
ELSIF deleting then
dbms_output.put_line('deleting Trigger ๋ฐ์');
v_modType := '์ญ์ ';
END IF;
INSERT INTO dept_copy
VALUES(:old.dno, :old.dname, :old.loc, v_modType);
dept_orgin ํ ์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์์ (update), ์ญ์ (delete) ํ๊ฒ ๋๋ฉด dept_copy ํ ์ด๋ธ์ ์์ , ์ญ์ ๋ ๋ฐ์ดํฐ๋ค์
์ ์ฅํ๊ณ ์์ /์ญ์ ์ ์ ๋ณด๊ฐ ํ์๋๋ ๊ตฌํ๋ถ ์คํฌ๋ฆฝํธ์ ์กฐํ๊ฒฐ๊ณผ์ด๋ค.
์กฐํ๊ฒฐ๊ณผ (UPDATE)
UPDATE dept_orgin SET dno=30, dname='SALES', loc='CHICAGO'
WHERE dno=10;
์กฐํ๊ฒฐ๊ณผ (UPDATE)
DELETE FROM dept_orgin WHERE dno=30;
'DBMS > OracleDB' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Oracle DB] ๋ฌธ์ ํจ์ LPAD, SUBSTR, REPLACE (0) | 2025.01.07 |
---|---|
[OracleDB] Constraints(์ ์ฝ์กฐ๊ฑด) ์ ๋ํด ์์๋ณด์ (0) | 2025.01.02 |