트리거(Trigger) 란? 

  • Triggering Event, 즉 Oracle DML 문인 INSERT, UPDATE, DELETE문이 TABLE에 대해 행해질 때 자동으로 수행되는 PROCEDURE
  • 행 트리거
    - 컬럼의 각각의 행의 데이터 행 변화가 생길때마다 실행
    - 실제 그 데이터 행의 실제값 제어가능
    - :old, :new
  • 문장 트리거
    - 트리거 사건에 의해 단 한번 실행되며, 컬럼의 각 데이터 행을 제어 할 수 없음
    - 컬럼의 데이터 값에 관계없이 컬럼에 변화가 일어남을 감지하여 실행되는 트리거
  • 문법

CREATE [OR REPLACE] TRIGGER trigger_name

BEFORE | AFTER

     trigger_event ON table_name

     [FOR EACH ROW]

     [WHEN (condition)]

     PL/SQL block

 

- BEFORE : INSERT, UPDATE, DELETE문이 실행되기 전에 트리거가 실행

- AFTER : INSERT, UPDATE, DELETE문이 실행된 후 트리거가 실행

- trigger_event : INSERT, UPDATE, DELETE 중에서 한 개 이상 올 수 있음

- FOR EACH ROW : 이 옵션이 있으면 행 트리거가 됨

 

  • Procedure와 Trigger의 차이점
Procedure Trigger
생성하면 소스코드와 실행코드(P-CODE)가 생성됨 생성하면 소스코드와 실행코드(P-CODE)가 생성됨
EXECUTE 명령어로 실행 생성 후 자동 실행
COMMIT, ROLLBACK 실행 가능 COMMIT, ROLLBACK 실행 안됨
  • 소스 예제
CREATE OR REPLACE TRIGGER Emp_Sal_Change
BEFORE
INSERT OR UPDATE ON emp
FOR EACH ROW
  WHEN (new.empno > 0)
  DECLARE
    sal_diff number;
BEGIN
  sal_diff := :new.sal - :old.sal;
  DBMS_OUTPUT.PUT_LINE('이전 급여 : ' ||:old.sal);
  DBMS_OUTPUT.PUT_LINE('신 급여 : ' || :new.sal);
  DBMS_OUTPUT.PUT_LINE('급여 차액 : '|| sal_diff);
END;
-- Table 추적 trigger
CREATE OR REPLACE TRIGGER emp_row_aud
  AFTER insert OR update OR delete ON emp
  FOR EACH ROW
BEGIN
  IF INSERTING THEN
    INSERT INTO emp_row_audit
      VALUES(emp_row_seq.NEXTVAL, :new.ename, 'inserting', SYSDATE);
  ELSIF UPDATING THEN
    INSERT INTO emp_row_audit
      VALUES(emp_row_seq.NEXTVAL, :old.ename, 'updating', SYSDATE);
  ELSIF DELETING THEN
    INSERT INTO emp_row_audit
      VALUES(emp_row_seq.NEXTVAL, :old.ename, 'deleting', SYSDATE);
  END IF;
END;

 

 

Ref. http://www.gurubee.net/lecture/1076

+ Recent posts