[CS Study] Database - Trigger

Frye 'de Bacon·2023년 12월 28일
0

Computer Science(CS)

목록 보기
37/40

Trigger

개요

트리거(Trigger)는 DBMS에서 특정 테이블에 DML문(INSERT, UPDATE, DELETE 등)이 수행되었을 때 '데이터베이스에서 자동으로 동작하도록 설정'된 프로그램이다. 즉, 사용자가 직접 호출하는 것이 아니라 데이터베이스에서 자동적으로 호출되는 사용자 정의 프로시저(Procedure)이다.

프로시저(Procedure)란 '데이터베이스에 대한 일련의 작업을 정리한 절차를 RDBMS가 저장한 것으로, 간단하게 말하면 여러 SQL문을 모아 하나의 쿼리로 만든 것이다. 함수와 비슷한 개념으로 이해할 수 있다(비슷한 것이지 같은 것은 아니므로 주의).

트리거를 통해 SQL 제약 조건(Constraint) 방법으로는 명시할 수 없는 무결성 제약 조건을 구현함으로써, 제약 조건과 함께 데이터의 무결성(Integrity)을 유지하는 방법이다.

트리거의 종류

트리거는 문장 트리거(Statement level trigger)행 트리거(Row level trigger)로 나눌 수 있다.

  1. 문장 트리거(State level trigger)

    • 트리거가 설정된 테이블에 트리거 이벤트가 발생할 경우, 많은 행에 대한 변경 작업이 발생하더라도 단 한 번만 수행되는 트리거
    • Column 값에 변화가 발생할 때마다 실행되는 방식
    • FOR EACH ROW 옵션을 선언하지 않음으로써 문장 트리거로 선언
  2. 행 트리거(Row level trigger)

    • 조건을 만족하는 여러 개의 행에 대하여 반복적으로 수행되는 트리거
    • Column의 데이터 행에 변화가 발생할 때마다 실행되는 방식
    • FOR EACH ROW 옵션을 선언하여 행 트리거로 선언
    • 변경 전후의 행을 OLD, NEW를 통해 확인 가능
      • OLD : 변경 전의 데이터로서 UPDATE로 수정되거나 DELETE로 삭제되기 전의 데이터
      • NEW : 변경 후의 데이터로서 UPDATE로 수정되거나 INSERT로 삽입된 후의 데이터

트리거의 유형

트리거는 실행 시점에 따라 세 가지 유형으로 구분할 수 있다.

  • After trigger : 이벤트가 발생한 후 실행되는 트리거로, 데이터의 변경 작업이 완료된 후에 수행
  • Before trigger : 이벤트가 발생하기 전 실행되는 트리거로, 데이터 변경 작업이 실시되기 전 수행
  • Instead of trigger : 이벤트가 발생했을 때 원래의 데이터 변경 작업 대신 트리거에 정의된 작업을 수행하는 것으로, 일반적으로 뷰(View)와 함께 사용됨

트리거의 제약

트리거에는 몇 가지 제약 조건이 존재한다.

  • 트리거는 TCL(COMMIT, ROLLBACK, SAVEPOINT)을 사용할 수 없다.
  • Triggering 문장의 실행 부분으로서, Triggering 문장과 동일한 트랜잭션에 존재한다.
    ※ Triggering 문장 : Trigger가 자동으로 실행되게끔 설정되는 대상 문장
  • Triggering 문장이 커밋되거나 롤백될 경우 트리거 작업 역시 커밋 혹은 롤백된다.

트리거의 장단점

  1. 트리거 사용 시의 장점
    • 데이터 무결성 강화(참조 무결성)
    • 업무 처리 자동화
  2. 트리거 사용 시의 단점
    • 과도한 트리거 사용으로 복잡한 상호 의존성 야기 가능
    • 유지 보수가 어렵고 예상치 못한 오류의 발생이 가능

트리거의 구성

트리거는 다음과 같은 요소로 구성된다.

구성 요소내용
선언(Declare)트리거의 명칭을 정의
이벤트(Event)트리거가 실행되는 시점을 명시
시작/종료(Begin/End)트리거의 시작과 종료를 나타내는 것으로, BEGIN과 END가 쌍을 이룸
다수의 실행을 제어하는 기본적 단위로서 논리적인 프로세스를 구성
제어(Control)단위 블록별 실행 흐름을 제어하며, IF문과 CASE문으로 구분
SQL주로 DML(INSERT, UPDATE, DELETE)문을 사용하나, 경우에 따라 DDL도 사용(자주 사용되지는 않음)
예외(Exception)시작/종료 사이의 SQL문이 실행될 때 예외가 발생할 경우 그 예외의처리 방법을 정의

트리거의 형식

트리거는 기본적으로 다음과 같이 선언한다.

CREATE [OR REPLACE] TRIGGER '트리거 이름'
BEFORE | AFTER
[INSERT | UPDATE | DELETE] ON '테이블 이름'
[REFERENCING NEW | OLD TABLE AS '테이블 이름']
[FOR EACH ROW]
[WHEN '조건식']
BEGIN
	'SQL'
END	

상기에서 사용된 각 명령어들은 다음과 같은 기능을 한다.

명령어기능
CREATE트리거 생성
OR REPLACE같은 이름의 트리거가 존재할 경우 해당 트리거의 내용을 현재 선언하는 트리거로 갱신
(이 옵션을 명시하지 않았는데 동명의 트리거가 존재할 경우 에러 발생)
BEFORE/AFTER트리거의 유형 결정(트리거의 동작 시점 결정)
DMLINSERT, UPDATE, DELETE 등 해당 동작이 실행될 때 트리거가 실행됨
REFERENCING NEW/OLD트리거의 실행 대상이 되는 데이터를 결정(추가, 수정, 삭제 작업 수행 전의 데이터 혹은 작업 수행 후의 데이터)
FOR EACH ROW행 트리거로 선언
WHEN트리거 실행 시 특정 조건의 데이터에 대해서만 트리거를 실행하도록 하는 조건식 설정
BEGIN/END트리거의 본문 코드를 입력하는 부분으로 하나 이상의 SQL문을 포함

트리거의 관리

  • 트리거 조회
    SELECT * 
    FROM USER_TRIGGERS;
  • 트리거 활성화/비활성화
    ALTER TRIGGER '트리거 이름' [ENABLE | DISABLE];
  • 테이블에 속한 트리거 활성화/비활성화
    ALTER TABLE '테이블 이름' [ENABLE | DISABLE] ALL TRIGGER;
  • 트리거 수정 후 재컴파일
    ALTER TRIGGER '트리거 이름' COMPILE;
  • 트리거 삭제
    DROP TRIGGER '트리거 이름';

참고 자료

profile
AI, NLP, Data analysis로 나아가고자 하는 개발자 지망생

0개의 댓글