본문 바로가기
개발/DB

[DB] 트리거(Trigger)

by BENGGRI 2021. 2. 16.
반응형

트리거(Trigger)

  • 특정 테이블에 삽입, 수정, 삭제 등의 데이터 변경 이벤트가 발생하면 DBMS에서 자동적으로 실행되도록 구현된 프로그램입니다.
  • 이벤트는 전체 트랜잭션 대상과 각행에 의해 발생되는 경우 모두를 포함할 수 있으며 테이블과 뷰(View), DB 작업대상으로 정의할 수 있습니다.

트리거의 목적

  • 특정 테이블에 대한 데이터 변경을 시작점으로 설정하고, 그와 관련된 작업을 자동적으로 수행하기 위해 트리거를 사용합니다.
  • 일반적으로 이벤트와 관련된 테이블의 데이터 삽입, 추가, 삭제 작업을 DBMS가 자동적으로 실행시키는데 활용합니다.

트리거의 종류

종류 설명
헹 트리거 데이터 변화가 생길 때마다 실행
문장 트리거 트리거에 의해 단 한 번 실행

트리거의 구성

프로시저나 사용자 정의함수와 기본적 문법은 같습니다.

반환 값이 없고, DML을 주된 목적으로 한다는 점에서는 프로시저와 비슷합니다.

  • 트리거 실행을 위한 이벤트를 인지하기 위해 EVENT 명령을 사용합니다.
  • 외부 변수 IN / OUT 이 없습니다.

구성요소 설명
선언부(DECLARE) 트리거의 명칭을 정의하는 부분
이벤트부(EVENT) 트리거가 실행되는 타이밍, 이벤트를 명시하는 부분
시작/종료부(BEGIN/END) 트리거의 시작과 종료를 표현하며, BEGIN/END가 쌍을 이룸
다수 실행을 제어하는 기본적 단위가 되며 논리적 프로세스를 구성
제어부(CONTROL) 기본적으로는 순차적으로 처리
비교 조건에 따라 블록 또는 문장을 실행
조건에 따라 반복 실행
SQL DML을 주로 사용
자주 사용되지는 않지만 DDL(CREATE, ALTER, DROP, TRUNCATE)을 사용
예외부(EXCEPTION) BEGIN~END절에서 실행되는 SQL문이 실행될 때 예외 발생 시 예외 처리 방법을 정의하는 처리부

 

선언부(DECLARE)

CREATE TRIGGER 트리거명

CREATE OR REPLACE TRIGGER 트리거명
구성 설명
CREATE DBMS 내에 객체(트리거, 함수, 프로시저)를 생성
OR REPLACE 는 기존 프로시저 존재 시 현재 컴파일 하는 내용으로 덮어씀
(같은 이름의 프로시저가 존재할 경우 OR REPLACE 가 없으면 에러 발생)
TRIGGER 트리거(TRIGGER)를 사용한다는 의미
트리거명 해당 트리거를 지칭하는 이름


이벤트부(TRIGGER)

순서 이벤트 ON 테이블명
[FOR EACH ROW]

-- 순서 : BEFORE, 이벤트 : 하나의 이벤트(INSERT)
BEFORE INSERT ON TABLE_NAME

-- 순서 : AFTER, 이벤트 : 여러 이벤트(INSERT, DELETE)
AFTER INSERT OR DELETE ON TABLE_NAME

-- 순서 : AFTER, 이벤트 : 하나의 이벤트(INSERT)
AFTER INSERT ON TABLE_NAME
FOR EACH ROW -- 변경되는 데이터 행의 수만큼 실행 INSERT, DELETE 는 FOR EACH ROW 없이 사용할 수 없음

 

시작/종료부(BEGIN/END)

트리거의 실행 시작과 종료를 알려주는 부분으로 프로시저에 BEGIN, END는 프로시저에 반드시 포함되어야 합니다.


제어부(CONTROL)

단위 블록별 실행흐름을 제어하는 부분으로 크게 IF문과 CASE문으로 나뉩니다.


SQL

  • SELECT, INSERT, UPDATE, DELETE 를 주로 사용합니다.
  • 행 트리거 안에서 접두어를 붙여 OLD(데이버 변경 전) NEW(데이터 변경 후) 값을 참조합니다.

 

데이터 작업 OLD NEW
INSERT NULL 삽입 후 값
UPDATE 갱신 전 값 갱신 후 값
DELETE 삭제 전 값 NULL

 

예외부(EXCEPTION)

반드시 포함될 필요는 없습니다.

트리거 실행 중 발생 가능한 예외 상황을 수행하는 부분입니다.


트리거 예시

 주의사항

  • 트리거 내에서는 COMMIT, ROLLBACK 등의 트랜잭션 제어어(TCL) 사용 시 컴파일 에러가 발생합니다.
  • 트리거 실행 중 오류가 발생하게 되면 트리거 실행의 원인을 제공한 데이터 작업에도 영향을 미치게 됩니다.
    (테이블에 데이터를 INSERT 후 실행되는 트리거에서 오류가 발생할 경우 트리거 후 작업이 진행되지 않거나 데이터가 추가되지 않습니다.)

 

-- 선언부
CREATE TRIGGER INSERT_TABLE_NAME

-- 이벤트부
AFTER INSERT ON TABLE_NAME
FOR EACH ROW

-- 시작/종료부
BEGIN

-- 제어부
IF INSERTING -- IF INSERTING, IF UPDATING, IF DELETING
THEN
-- SQL
  INSERT INT TABLE_NAME_HISTORY
  (
    COL_1,
    COL_2, 
    COL_3
  ) VALUES (
    :NEW.COL_1,
    :NEW.COL_2,
    "INSERT"
  );

END IF;
END;

[DB] 프로시저(Procedure)

[DB] 사용자 정의함수(User-Defined Function)


 

반응형

댓글