ํธ๋ฆฌ๊ฑฐ๋?
์คํค๋ง ๊ฐ์ฒด์ ์ผ์ข ์ผ๋ก, ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋ฏธ๋ฆฌ ์ ํด ๋์ ํน์ ์กฐ๊ฑด์ด ๋ง์กฑ๋๊ฑฐ๋
์ด๋ค ๋์์ด ์ํ๋๋ฉด ์๋์ผ๋ก ์คํ๋๋๋ก ์ ์ํ ๋์.
ex. ํ ์ด๋ธ์ DML ๋ฌธ์ฅ์ด ์คํ ๋๊ฑฐ๋, ์ฌ์ฉ์๊ฐ ์ค์ ํ DDL ๋ฌธ์ฅ์ด ์ํ๋ ๋
ํธ๋ฆฌ๊ฑฐ๊ฐ ์คํ๋ ์ ์๋ค.
ํธ๋ฆฌ๊ฑฐ(TRIGGER)์ ํ
| DML ํธ๋ฆฌ๊ฑฐ | INSERT, DELETE, UPDATE ์์ ์ด ์ผ์ด๋ ๋ ์๋์ผ๋ก ์คํ๋๋ ๊ฐ์ฒด๋ก ์ด๋ฐ TRIGGER๋ฅผ DML TRIGGER๋ผ ํ๋ค. |
| INSTEAD OF ํธ๋ฆฌ๊ฑฐ | ํ ์ด๋ธ์ด ์๋ ๋ทฐ์ ์ ์๋ ํธ๋ฆฌ๊ฑฐ |
| ์์คํ ํธ๋ฆฌ๊ฑฐ | ์คํค๋ง ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์๋ ํธ๋ฆฌ๊ฑฐ |
ํธ๋ฆฌ๊ฑฐ ๊ธฐ๋ณธ ๊ตฌ๋ฌธ
ํธ๋ฆฌ๊ฑฐ๋ฅผ ์์ฑํ๊ฑฐ๋ ์ญ์ ํ๊ธฐ ์ํด์๋ ์ฌ์ฉ์๋ CREATE TRIGGER ๊ถํ์ ๊ฐ์ ธ์ผ ํ๋ค.
-- ๊ด๋ฆฌ์ ๊ณ์ : sky ๊ณ์ ์ ํธ๋ฆฌ๊ฑฐ๋ฅผ ๋ง๋ค ์ ์๋ ๊ถํ ๋ถ์ฌ
GRANT CREATE TRIGGER TO sky;
-- sky ๊ณ์ : ์์คํ
๊ถํ ํ์ธ
SELECT * FROM user_sys_privs;
-- ํธ๋ฆฌ๊ฑฐ ํ์ธ
SELECT * FROM user_triggers;
-- ํธ๋ฆฌ๊ฑฐ ์์ค ํ์ธ
SELECT * FROM user_source;
-- ์์กด์ฑ ํ์ธ
SELECT * FROM user_dependencies;
-- ํธ๋ฆฌ๊ฑฐ ์ญ์
DROP TRIGGER testtrigger;
๋ฌธ์ฅ ํธ๋ฆฌ๊ฑฐ
ํธ๋ฆฌ๊ฑฐ๊ฐ ์ค์ ๋ ํ ์ด๋ธ์ ํธ๋ฆฌ๊ฑฐ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ๋ง์ ํ์ ๋ํด ๋ณ๊ฒฝ ์์ ์ด ๋ฐ์ํ๋๋ผ๋ ์ค์ง ํ๋ฒ๋ง ํธ๋ฆฌ๊ฑฐ๋ฅผ ๋ฐ์ ์ํจ๋ค.
-- test ํ
์ด๋ธ์ ์ง์ ๋ ์๊ฐ์๋ง dml์ด ๊ฐ๋ฅํ ํธ๋ฆฌ๊ฑฐ ๋ง๋ค๊ธฐ
CREATE OR REPLACE TRIGGER testtrigger
BEFORE INSERT OR UPDATE OR DELETE ON TEST
BEGIN
if TO_CHAR(SYSDATE,'d') in (1,7) OR
--(to_char(sysdate,'hh24') < 9 or to_char(sysdate,'hh24') > 18) then
(TO_CHAR(SYSDATE,'hh24') >= 11 AND TO_CHAR(SYSDATE,'24') <= 12) THEN
RAISE_APPLICATION_ERROR(-20001,'์ง์ ๋ ์๊ฐ์๋ง ๋ฐ์ดํฐ๋ฅผ ์์ ํ ์ ์๋ค');
End If;
End;
ํ ํธ๋ฆฌ๊ฑฐ
์กฐ๊ฑด์ ๋ง์กฑํ๋ ์ฌ๋ฌ ๊ฐ์ ํ์ ๋ํด ํธ๋ฆฌ๊ฑฐ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ์ํํ๋ ๋ฐฉ๋ฒ์ผ๋ก 'FOR EACH ROW [WHEN ์กฐ๊ฑด]'์ ์ ์ ์๋๋ค. ํธ๋ฆฌ๊ฑฐ๊ฐ ์ค์ ๋ ํ ์ด๋ธ์ DELETE ์ด๋ฒคํธ๊ฐ ๋ฑ๋ก๋ ๊ฒฝ์ฐ, ํด๋น ํ ์ด๋ธ์์ DELETE ์์ ์ด 10๋ฒ ์ผ์ด๋๋ฉด ํธ๋ฆฌ๊ฑฐ๋ 10๋ฒ ์คํ๋๋ค. ํธ๋ฆฌ๊ฑฐ ์ด๋ฒคํธ๊ฐ ํ์ ์ํฅ์ ์ฃผ์ง ์์ผ๋ฉด ํ ํธ๋ฆฌ๊ฑฐ๋ ํ๋ฒ๋ ์คํํ์ง ์๋๋ค.
-- ํ ํธ๋ฆฌ๊ฑฐ
-- : DML ๋ฌธ์์ ์กฐ๊ฑด๋ง์กฑํ๋ ๋ชจ๋ ํ์ ๋ํ์ฌ ํธ๋ฆฌ๊ฑฐ๋ ์ผ์ด๋๋ค.
-- : ์๋ฅผ ๋ค์ด "DELETE FROM ํ
์ด๋ธ;" ๋ฌธ์ฅ์ผ๋ก 5๊ฐ์ ๋ ์ฝ๋๊ฐ ์ญ์ ๋ ๊ฒฝ์ฐ ํธ๋ฆฌ๊ฑฐ๋ 5๋ฒ ์คํ ๋๋ค.
-- : OLD ์ NEW ๋ ์ฝ๋
-- ํ ํธ๋ฆฌ๊ฑฐ์์๋ง ์ฌ์ฉ ๊ฐ๋ฅ
-- :OLD
UPDATE ์์๋ ์์ ์ ๋ ์ฝ๋, DELETE ์์๋ ์ญ์ ํ ๋ ์ฝ๋
-- :NEW
INSERT์์๋ ์ถ๊ฐํ ๋ ์ฝ๋, UPDATE ์์๋ ์์ ํ ๋ ์ฝ๋
-- score1 ํ
์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ์ถ๊ฐ๋๋ฉด score2 ํ
์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ์ถ๊ฐ๋๋ ํธ๋ฆฌ๊ฑฐ ์์ฑ
-- insert ํธ๋ฆฌ๊ฑฐ
CREATE OR REPLACE TRIGGER scoreinserttrigger
AFTER INSERT ON score1
FOR EACH ROW -- ํ ํธ๋ฆฌ๊ฑฐ
DECLARE
-- ํ์ํ ๋ณ์ ์ ์ธ
BEGIN
INSERT INTO score2(hak, kor, eng, mat) VALUES(:NEW.hak,
fngrade(:NEW.kor), fngrade(:NEW.eng), fngrade(:NEW.mat));
-- :new ํธ๋ฆฌ๊ฑฐ์์ ์ฌ์ฉํ ์ ์๋ ์์ฝ์ด
END;
/
ํธ๋ฆฌ๊ฑฐ ์์ฑ
- WHEN TRIGGER์กฐ๊ฑด : ํธ๋ฆฌ๊ฑฐ ์ด๋ฒคํธ ์ค์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ฐ์ดํฐ๋ง ํธ๋ฆฌ๊ฑฐ ํ๋ค.
- OLD์ NEW์์ฌ ๋ ์ฝ๋
- OLD์ NEW๋ ๋ฌธ์ฅ ํธ๋ฆฌ๊ฑฐ์์๋ ์ฌ์ฉํ ์ ์์ผ๋ฉด ํ ํธ๋ฆฌ๊ฑฐ์์๋ง ์ฌ์ฉํ๋ค. OLD์ NEW๋ WHEN์ ์์๋ OLD,NEW์ฒ๋ผ ์์ ์ฝ๋ก (:)์ ๋ถ์ด์ง ์์ง๋ง ํธ๋ฆฌ๊ฑฐ ๋ณธ๋ฌธ์์๋ ์ฝ๋ก (:)์ ๋ถ์ฌ์ผ ํ๋ค. OLD๋ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์ง๋ง NEW๋ ๊ฐ๋ฅํ๋ค.
- :OLD = UPDATE: ์์ ์ ์๋ฃ, DELETE : ์ญ์ ํ ์๋ฃ
- :NEW = INSERT : ์ ๋ ฅํ ์๋ฃ, UPDATE: ์์ ํ ์๋ฃ
--ํธ๋ฆฌ๊ฑฐ ์์ฑ
CREATE[OR ROPLACE] TRIGGER ํธ๋ฆฌ๊ฑฐ์ด๋ฆ {BEFORE|AFTER}
์ด๋ฒคํธ ON ํ
์ด๋ธ์ด๋ฆ
[FOR EACH ROW [WHEN TRIGGER์กฐ๊ฑด]]
DECLARE
๋ณ์,์์๋ฑ ์ ์ธ
BEGIN
์คํ๊ตฌ๋ฌธ
END;
-- ํธ๋ฆฌ๊ฑฐ ์คํ ์๊ธฐ
-- BEFORE :ํ
์ด๋ธ์ DML ํธ๋ฆฌ๊ฑฐ ์ด๋ฒคํธ ์ ์ ํธ๋ฆฌ๊ฑฐ ๋ณธ๋ฌธ์ด ์คํ
-- AFTER : ํ
์ด๋ธ์ DML ํธ๋ฆฌ๊ฑฐ ์ด๋ฒคํธ ์ ์ ํธ๋ฆฌ๊ฑฐ ๋ณธ๋ฌธ์ด ์คํ
-- ์ด๋ฒคํธ : INSERT,UPDATE,DELETE
ํจํค์ง๋?
์ค๋ผํด์ ์ ์ฅ๋์ด ์๋ ์๋ก ๊ด๋ จ ์๋ PL/SQL ํ๋ก์์ , ํจ์, ํ์ ๋ฑ์ ๋ ผ๋ฆฌ์ ์ผ๋ก ๋ฌถ์ด ๋์ ์งํฉ
ํจํค์ง๋ ์ ์ธ๋ถ์ ๋ณธ๋ฌธ์ผ๋ก ๋๋๋ค.
ํจํค์ง ๋ด์์๋ ํ๋ก์์ , ํจ์๋ ์ค๋ฒ๋ก๋ฉ(์ค๋ณต ์ ์)์ด ๊ฐ๋ฅํ๋ค.
์ค๋ฒ๋ก๋ฉ
๋งค๊ฐ๋ณ์์ ๊ฐ์๋ ํ์ ์ด ๋ค๋ฅด๋ฉด ๋์ผํ ์ด๋ฆ์ผ๋ก ํ๋ก์์ ๋ ํจ์๋ฅผ ์ฌ๋ฌ๊ฐ ์ ์ ํ ์ ์๋ค.
์ค๋ฒ๋ก๋ฉ์ ํจํค์ง ๋ด์์๋ง ๊ฐ๋ฅํ๋ค.
ํจํค์ง
ํจํค์ง ์ ์ธ
์ ์ธ์ ์ ํจํค์ง์ ํฌํจ๋ PL/SQL ํ๋ก์์ ๋, ํจ์, ์ปค์, ๋ณ์, ์์ธ ์ ์ ์ ์ธํ๋ค. ํจํค์ง ์ ์ธ๋ถ์์ ์ ์ธํ ๋ชจ๋ ์์๋ค์ ํจํค์ง ์ ์ฒด์ ์ ์ฉ๋๋ค.
CREATE OR REPLACE PACKAGE pEmp IS
FUNCTION fnTax(pay IN NUMBER) RETURN NUMBER;
PROCEDURE empList(pName VARCHAR2);
PROCEDURE empList;
END pEmp;
/
--ํจ์์ ํ๋ก์์ ์์ฑ
--ํ๋ก์์ ์ด๋ฆ์ด ๊ฐ๋ค,์ค๋ฒ๋ก๋ฉ ๊ฐ๋ฅ(๋งค๊ฐ๋ณ์๊ฐ ๋ค๋ฅด๋ฉด ๋ค๋ฅธ ํ๋ก์์ ๋ก ์ฒ๋ฆฌํจ)
ํจํค์ง ์์ฑ
ํจํค์ง ๋ณธ๋ฌธ์ ํจํค์ง์์ ์ ์ธ๋ ํ๋ก์์ ๋ ํจ์์ ๋ชธ์ฒด๋ฅผ ๊ตฌํํ๋ค.
--ํจํค์ง ๋ชธ์ฒด ๊ตฌํ
CREATE OR REPLACE PACKAGE BODY PEMP IS
FUNCTION FNTAX(PAY IN NUMBER) --ํจ์
RETURN NUMBER
IS
T NUMBER := 0;
BEGIN
IF PAY >= 3000000 THEN T := TRUNC(PAY*0.03,-1);
ELSIF PAY >= 2000000 THEN T := TRUNC(PAY*0.02,-1);
ELSE T :=0;
END IF;
RETURN T;
END;
PROCEDURE EMPLIST(PNAME VARCHAR2) --ํ๋ก์์
IS
VNAME VARCHAR2(30);
VSAL NUMBER;
CURSOR CUR_EMP IS
SELECT NAME,SAL
FROM EMP WHERE INSTR(NAME,PNAME)>=1;
BEGIN
OPEN CUR_EMP;
LOOP
FETCH CUR_EMP INTO VNAME,VSAL;
EXIT WHEN CUR_EMP%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(VNAME||':'||VSAL);
END LOOP;
CLOSE CUR_EMP;
END;
PROCEDURE EMPLIST --ํ๋ก์์
IS
BEGIN
FOR REC IN (SELECT NAME,SAL+BONUS PAY,FNTAX(SAL+BONUS)TAX FROM EMP)LOOP
DBMS_OUTPUT.PUT_LINE(REC.NAME||':'||REC.PAY||':'||REC.TAX);
END LOOP;
END;
END PEMP;
ํจํค์ง๋ด์ ํจ์๋ ํ๋ก์์ ์คํ์ ํจํค์ง ๋ช ๋ค์์ ์ (.)์ ์ฐ๊ณ ํ๋ก์์ ๋ ํจ์๋ช ์ ์ ์ด์ค๋ค.
EXEC pEmp.empList('๊น');
EXEC pEmp.empList;
ํจํค์ง ์ญ์
--์ ์ธ๋ถ์ ๋ชธ์ฒด ์ญ์
DROP PACKAGE ํจํค์ง๋ช
;
--๋ชธ์ฒด ์ญ์
DROP PACKAGE BOOY ํจํค์ง๋ช
;'๐ป > ORACLE' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| (30)[ORACLE] 13์ผ์ฐจ : ์ธ๋ฑ์ค(INDEX) (1) | 2024.03.27 |
|---|---|
| (29)[ORACLE] 12์ผ์ฐจ : PL/SQL - 4 (์์ธ์ฒ๋ฆฌ) (0) | 2024.03.27 |
| (29)[ORACLE] 12์ผ์ฐจ : PL/SQL - 3 (์ปค์์ ๋์ ์ฟผ๋ฆฌ) (0) | 2024.03.26 |
| (28)[ORACLE] 11์ผ์ฐจ : PL/SQL - 2 (0) | 2024.03.25 |
| (28)[ORACLE] 11์ผ์ฐจ : PL/SQL (1) | 2024.03.25 |