[pl/sql] 트리거(trigger)란

이상원·2023년 11월 17일

PL/SQL

목록 보기
4/5

Database Triggers Overview

트리거란

  • Oracle Database Concepts 문서에서의 트리거 정의:
    트리거(Trigger)는 데이터베이스에서 발생하는 특정 이벤트에 응답하여 자동으로 실행되는 PL/SQL 프로그램입니다. 이벤트는 테이블이나 뷰에 대한 데이터 조작 언어 (DML) 문이거나, 데이터 정의 언어 (DDL) 문이거나, 데이터베이스 이벤트 (예: 시작 또는 종료) 등이 될 수 있습니다.

트리거 종류

  • 특정 테이블 또는 뷰에 대한 모든 사용자가 실행한 DML 문 (INSERT, UPDATE, DELETE, MERGE)
  • 특정 스키마/사용자 또는 데이터베이스의 모든 스키마/사용자에 의해 실행된 DDL 문 (주로 CREATE 또는 ALTER)
  • 특정 스키마/사용자 또는 데이터베이스의 모든 스키마/사용자에 의해 실행된 데이터베이스 이벤트, 예를 들어 로그인/로그아웃, 오류, 또는 시작/종료

  • 트리거에서 에러가 발생하면 트리거를 유발한 문장이 실패한다!
  • 본 문서에서는 DML 관련 Trigger만 다룸
  • DML Triggers는 2가지로 나뉜다.
  1. 문장 트리거(Statement Trigger)
  2. 행 트리거(Row Trigger)

문장 트리거(Statement Trigger)

  • 트리거 사건에 의해 단 한번 실행되며, 컬럼의 각 데이터 행을 제어 할 수 없음
  • 컬럼의 데이터 값에 관계없이 컬럼에 변화가 일어남을 감지하여 실행되는 트리거

행 트리거(Row Trigger)

  • 컬럼의 각각의 행의 데이터 행 변화가 생길때마다 실행
  • 실제 그 데이터 행의 실제값 제어가능
  • :old, :new 키워드를 사용하여 트리거 적용 전, 후의 테이블을 사용할 수 있다

DML Triggers

문장 트리거(Statement Trigger) 예시

    CREATE OR REPLACE TRIGGER secure_employees
    BEFORE INSERT or UPDATE or DELETE ON employees
    BEGIN
      IF (TO_CHAR(SYSDATE,'DY') IN ('SAT','SUN')) OR (TO_CHAR(SYSDATE,'HH24:MI') BETWEEN '08:00' AND '12:00') THEN
        RAISE_APPLICATION_ERROR(-20500, 'You may insert into employees table only during business hours.');
      END IF;
    END;
    /

    UPDATE employees
    SET salary = salary + 100
    WHERE rownum = 1;

    DROP TRIGGER secure_employees;
  • 현재 시각이 비지니스 아워가 아닌 경우 예외 발생

행 트리거(Row Trigger) 예시

    CREATE OR REPLACE  TRIGGER restrict_salary
    BEFORE INSERT OR UPDATE OF salary ON employees
    FOR EACH ROW 
    BEGIN
      IF NOT (:NEW.job_id IN ('AD_PRES', 'AD_VP')) AND :NEW.salary > 15000 THEN
        RAISE_APPLICATION_ERROR (-20202, 'Employee cannot earn more than $5,000.');
      END IF;
    END;
    /

    UPDATE employees
    SET salary = salary + 4500
    WHERE deptno = 10;

    select trigger_name, trigger_body  
    from user_triggers;
  • INSERT OR UPDATE 적용 후 (:new) job_id 가 ('AD_PRES', 'AD_VP') 이고 salary가 15000 이상인 경우 예외 발생
profile
Sang9riG9ru

0개의 댓글