트리거

 

트리거는 지정된 테이블에 삽입, 수정, 삭제 등의 데이터 변경 이벤트가 발생하면 자동으로 실행되는 프로그램입니다.

 

트리거는 언제 실행되는지에 따라 두가지로 분류 됩니다.

 

데이터 변화가 생길때마다 실행되는 행 트리거가 있고, 한번 만 실행이되는 문장 트리거로 나눠져 있습니다. 

 

또한 다른 절차형 SQL인 프로시저나 사용자 정의함수와는 다르게 외부 변수가 사용되지 않는다는 특징을 가지고 있습니다.

 

이제 트리거의 구조에 대해서도 알아봅시다.

 

 

트리거의 선언부 (DECLARE)에서는 트리거의 이름과 변수, 데이터 타입 등을 정의합니다.


CREATE TRIGGER PUT_EMPLOYEE_HIST

 

CREATE TRIGGER을 이용해 PUT_EMPLOYEE_HIST라는 트리거를 생성하였습니다. 

 

 

다음은 트리거에서만 나타나는 특징인 이벤트부 (EVENT)입니다.

 

이벤트부에서는 트리거가 전(BEFORE)에 실행되는지 끝난 후(AFTER)에 실행되는지를 정하는 타이밍과 INSERT, UPDATE, DELETE 중 어떤 SQL 이벤트가 일어날지를 명시하게 됩니다. 

 

AFTER UPDATE OR DELETE
ON EMPLOYEE
FOR EACH ROW

 

다음 코드는 EMPLOYEE의 수정 및 삭제가 발생할 경우에 PUT_EMPLOYEE_HIST 트리거가 실행되도록 이벤트를 지정하였습니다. 

 

 

다음으로는 시작부(BEGIN) 종료부(END)입니다. 

 

다른 절차형 SQL과 마찬가지로 시작부와 종료부는 다수의 실행을 제어하는 기본 단위입니다. 반드시 시작부가 나오면 종료부로 마무리 지어야합니다.

 

BEGIN은 선언부의 뒤에 오며 선언부를 제외한 프로시저의 모든 구조들은 BEGIN과 END사이에 정의되어야합니다.  

 

 

제어부 (CONTROL)는  조건문인 IF문과 CASE문을 사용해 문장을 처리합니다.

 

 

트리거의 SQL에서는 SELECT, INSERT, DELETE, UPDATE와 같은 DML이 주로 사용되며 가끔 DDL도 사용됩니다.

 

다음은 제어부와 SQL을 같이 사용한 형태입니다. 

 

IF UPDATING
 THEN
    INSERT INTO EMPLOYEE_HIST(EMPLOYEE_ID, EMPLOYEE_NAME, EMPLOYEE_STATUS)
    VALUES ( :OLD. EMPLOYEE_ID, :NEW.EMPLOYEE_NAME, "부서이동");

ELSIF DELETING
  THEN
    INSERT INTO EMPLOYEE_HIST(EMPLOYEE_ID, EMPLOYEE_NAME, EMPLOYEE_DEPT)
    VALUES ( :OLD.EMPLOYEE_ID, :OLD.EMPLOYEE_NAME, "퇴사");
END IF;

 

다음 코드는 IF문을 이용하여 UPDATE 될 경우와 DELETE될 경우 SQL 이벤트를 분리했습니다.

 

UPDATE는 EMPLOYEE에서 갱신 전 EMPLOYEE_ID와 EMPLOYEE_NAME을 그대로 쓰고 EMPLOYEE_STATUS를 부서이동으로 EMPLOYEE_HIST에 삽입하도록 합니다.

 

DELETE는 EMPLOYEE에서 값을 삭제 전에 EMPLOYEE_ID와 EMPLOYEE_NAME 그대로 넣고 EMPLOYEE_DEPT 퇴사를 로 EMPLOYEE_HIST 삽입하는 동작을 하게 됩니다.

 

 

예외부(EXCEPTION)는 BEGIN~END문 사이의 SQL문의 실행에 예외 발생시 처리 방법을 정의하는 처리부분입니다.

 

예외부는 반드시 사용해야할 부분이 아니므로 생략해도 상관없습니다.

 

 

트리거는 이벤트 발생시 자동으로 호출되므로 별 다른 호출 방법이 존재하지 않습니다.

+ Recent posts