9 Trigger(트리거)

출처 http://www.gurubee.net/lecture/1076

트리거란?

  INSERT, UPDATE, DELETE문이 TABLE에 대해 행해질 때 묵시적으로 수행되는 PROCEDURE 이다.

  트리거는 TABLE과는 별도로 DATABASE에 저장 된다.

  트리거는 VIEW에 대해서가 아니라 TABLE에 관해서만 정의 될 수 있다.

  행 트리거 : 컬럼의 각각의 행의 데이터 행 변화가 생길때마다 실행되며, 그 데이터 행의 실제값을 제어할 수 있다.

  문장 트리거 : 트리거 사건에 의해 단 한번 실행되며, 컬럼의 각 데이터 행을 제어 할 수 없다.

트리거 문법

  • – BEFORE : INSERT, UPDATE, DELETE문이 실행되기 전에 트리거가 실행 된다.
  • – AFTER : INSERT, UPDATE, DELETE문이 실행된 후 트리거가 실행 된다.
  • – trigger_event : INSERT, UPDATE, DELETE 중에서 한 개 이상 올 수 있다.
  • – FOR EACH ROW : 이 옵션이 있으면 행 트리거가 된다.

간단한 트리거 예제 1

 
SQL> <strong>CREATE OR REPLACE TRIGGER</strong> triger_test
       <strong>BEFORE
       UPDATE ON</strong> dept
       <strong>FOR EACH ROW</strong>
	   
	   <strong>BEGIN</strong>
        DBMS_OUTPUT.PUT_LINE('변경 전 컬럼 값 : ' || : old.dname);
        DBMS_OUTPUT.PUT_LINE('변경 후 컬럼 값 : ' || : new.dname);
     <strong>END</strong>;
     /

-- DBMS_OUTPUT.PUT_LINE을 출력
SQL> <strong>SET SERVEROUTPUT ON</strong> ; 

-- UPDATE문을 실행시키면.. 
SQL> <strong>UPDATE</strong> dept <strong>SET</strong> dname = '총무부' <strong>WHERE</strong> deptno = 30

-- 트리거가 자동 실행되어 결과가 출력된다. 
변경 전 컬럼 값 : 인사과
변경 후 컬럼 값 : 총무부

1 행이 갱신되었습니다.
    

간단한 트리거 예제 2

 
SQL> <strong>CREATE OR REPLACE TRIGGER</strong> sum_trigger
       <strong>BEFORE
       INSERT OR UPDATE ON</strong> emp
       <strong>FOR EACH ROW</strong>

    <strong>DECLARE</strong>
	
        -- 변수를 선언할 때는 DECLARE문을 사용해야 한다 
        avg_sal NUMBER;
	
    <strong>BEGIN</strong>
	
        SELECT ROUND(AVG(sal),3)
        INTO avg_sal
        FROM emp;

        DBMS_OUTPUT.PUT_LINE('급여 평균 : ' || avg_sal);
	
    <strong>END</strong>; 
    /

-- DBMS_OUTPUT.PUT_LINE을 출력
SQL> <strong>SET SERVEROUTPUT ON</strong> ;

-- INSERT문을 실행해보자.
SQL> <strong>INSERT INTO</strong> EMP(EMPNO, ENAME, JOB, HIREDATE, SAL)
     <strong>VALUES</strong>(1000, 'LION', 'SALES', SYSDATE, 5000);

-- INSERT문을 실행되기 전까지의 급여 평균이 출력된다. 
급여 평균 : 2073.214

1 개의 행이 만들어졌습니다.
    

답글 남기기 0

Your email address will not be published. Required fields are marked *