본문 바로가기

Oracle/PL

PL Trigger

반응형
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/*
    Procedure : insert, delete, update
                IN, OUT
                
    Function : select
               RETURN
               
    Trigger : 촉발시키다, 스스로 발생하다.
              callback : 자동호출
              자동 호출 함수
                        old(이전값), new(새값)
              insert        X           O
              delete        O           X
              update        O           O
            
*/
SET SERVEROUTPUT ON
 
CREATE OR REPLACE TRIGGER trigger_test
--어떤 구문을 발생시키기전에 발생시켜라 
    BEFORE 
        UPDATE ON departments
        --FOR문이 반복하며 ROW를 검사
        FOR EACH ROW
BEGIN
    --OLD, NEW를 사용할때는 :를 붙여줘야한다.
    DBMS_OUTPUT.PUT_LINE('변경전 컬럼의 값: ' || :OLD.department_name);
    DBMS_OUTPUT.PUT_LINE('변경후 컬럼의 값: ' || :NEW.department_name);
END;
/
 
 
UPDATE departments
SET department_name = '정보기술부'
WHERE department_id = 60;
 
ROLLBACK;
 
-- ROW를 추가하는데 항상 평균 급여를 확인
CREATE OR REPLACE TRIGGER sum_trigger
     BEFORE
        INSERT OR UPDATE ON employees
        FOR EACH ROW
DECLARE 
    avg_sal NUMBER;
BEGIN
    SELECT ROUND(AVG(salary), 3INTO avg_sal
    FROM employees;
--  NEW, OLD 키워드가 아니라 :를 넣지 않아도 된다.
    DBMS_OUTPUT.PUT_LINE('급여 평균: '|| avg_sal);
END;
 
SELECT ROUND(AVG(salary), 3)
FROM  employees;
 
                    
INSERT INTO employees(employee_id, last_name, hire_date, department_id, job_id, salary, email)
                    VALUES(501'Tiger', sysdate, 60'IT_PROG'10000'Tiger@naver.com');
 
-- 사원번호를 수정하지 못하게 할 경우 
CREATE OR REPLACE TRIGGER emp_trigger
    BEFORE
        UPDATE OR DELETE OR INSERT ON EMPLOYEES
        FOR EACH ROW
BEGIN
    --업데이트가 됬을때
    IF UPDATING THEN 
        --사장의 번호를 못바꾸게 만든다 
        IF :OLD.employee_id = '100' THEN
            RAISE_APPLICATION_ERROR(-20001'이 번호를 수정할 수 없습니다.');
        END IF;
    END IF;
END;
/
 
--오류 발생 
UPDATE employees
SET salary = 2500
WHERE employee_id = 100;
 
--INSERT 막기
CREATE OR REPLACE TRIGGER nodata_trigger
    AFTER INSERT
    ON employees
BEGIN
    RAISE_APPLICATION_ERROR(-20001'데이터의 입력을 시도하였습니다');
    
    ROLLBACK;
END;
/
 
INSERT INTO employees(employee_id, last_name, hire_date, department_id, job_id, salary, email)
                    VALUES(502'Tiger', sysdate, 60'IT_PROG'10000'Tiger11@naver.com');
    
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cs
반응형

'Oracle > PL' 카테고리의 다른 글

PL 응용문제 (프로시져, 함수)  (0) 2019.12.21
PL function(함수)  (0) 2019.12.20
PL Procedure 프로시져, Cursor 커서  (0) 2019.12.20
PL 기초 활용  (0) 2019.12.19