[이론] PL/SQL - TRIGGER, 트리거란?

조민수·5일 전
0

Computer Science

목록 보기
18/19

TRIGGER, 트리거란?

  • DML : INSERT, UPDATE, DELETE 쿼리가 수행될 때,
    자동으로 수행되는 PROCEDURE의 일종
  • DB의 특정 이벤트가 발생하면 자동 실행되는 이벤트 핸들러

1. 행 트리거

  • COL의 각 ROW에서 값 변화가 생길때마다 실행
  • :old, :new

2. 문장 트리거

  • 트리거 사건에 의해 단 한번 수행, COL의 각 데이터 행 제어 불가
  • COL에 변화가 일어났음을 감지해 실행되는 트리거

형식

CREATE [OR REPLACE] TRIGGER TRG_NAME_T
(AFTER | BEFORE)
	(UPDATE OR INSERT OR DELETE) ON TABLE_A
FOR EACH ROW
DECLARE
-- 변수 선언
BEGIN
-- 구현
	INSERT INTO TABLE_A(...)
    VALUES(:OLD.EMP_ID, :OLD.SAL, :NEW.SAL);
END TRG_NAME_T;
  • AFTER : 변경 대상을 선 반영 후 관련 테이블에 반영
  • BEFORE : 관련 테이블에 먼저 반영 후 변경 대상에 반영
  • :OLD : 데이터 변경 전 가지고 있던 값
  • :NEW : 데이터 변경 후 가지고 있는 값
    • AFTER 트리거에서는 사용될 수 없음

TRIGGER 특징

  1. TABLE에 대해서만 사용 가능
    • 같은 테이블에서는 만들 수 없음
      → 항상 다른 테이블과 연쇄 반응이 일어나야 함
  2. VIEW, 서브커리, 인라인 뷰에서 사용 불가능
  3. AUTOCOMMIT : COMMIT, ROLLBACK 불가능
    → 트랜잭션을 사용할 수 없음
  4. 자동으로만 실행

TRIGGER 사용 시기

  1. 데이터 변경 시 자동으로 추가적인 처리가 필요할 때
    ex) 구매 → 재고 -1 → 수익 +1
  2. 데이터 로깅(logging)
  3. 데이터 무결성 강화를 위한 특정 로직 수행
  4. 특정 테이블 값의 변화로 다른 테이블을 자동 업데이트 할 때

TRIGGER 사용 시, 이점

  • 자동화 : 반복적인 작업을 로직화
  • 비즈니스 로직을 DB계층에서 적용, 안정성 향상
  • 데이터 무결성과 일관성 유지 가능
  • 애플리케이션 수준에서의 코드 간소화
  • 데이터 변경 내역 자동 기록

TRIGGER vs PROCEDURE

  • PROCEDURE
    : 사용자가 직접 호출해야만 실행되는 DB 내의 서브 프로그램
    → 즉, 내가 원할 때! 실행
    : 명시적으로 특정 작업 수행, 업무 로직을 명확히 구현할 때
    → 비즈니스 로직 수행 시 많이 사용

  • TRIGGER
    : 특정 DML이벤트 발생에 따라 자동으로 실행되는 프로그램
    : 업무상 복잡한 계산 처리, 데이터 변경에 따른 자동 업데이트
    → 데이터 상태 관리, 무결성 유지, 로그 기록 시 주로 사용

항목ProcedureTrigger
호출 방법직접 호출자동 실행
COMMIT/ROLLBACK가능불가능
사용 목적명시적 업무 로직 처리자동화된 이벤트 처리
유지보수 용이성좋음다소 어려움
성능 최적화관리 쉬움관리 어려울 수 있음
트랜잭션 관리명시적 제어 가능자동 제어

트리거는 편리하지만 과도한 사용으로 DB성능 저하를 초래함.
프로시저는 관리가 쉽고 로직 명확성이 뛰어남.
일반적으로 프로시저를 더 많이 사용


TRIGGER와 성능 향상

  1. 트리거 최소화
    : 트리거는 DB에 추가적인 부하를 주므로 꼭 필요한 경우에만 사용
  2. 로직 단순화
    : 트리거 내부에서 복잡한 비즈니스 로직을 과도하게 넣지 않도록 주의
  3. 대량 데이터 처리 유의
    : 트리거 내에서 대량 데이터를 처리하면 성능이 급격히 저하
  4. WHEN절을 통해 트리거 실행 조건을 제한, 불필요한 트리거 호출 방지
    : WHEN절 내에 트리거 실행 조건을 명확화
    create or replace trigger trg_name
     after update of salary on table_a
     for each row
     WHEN (OLD.salary <> NEW.salary) -- salary가 실제 변경 될 때만 실행

[참고자료]

profile
멈춤에 두려움을 느끼는 것

0개의 댓글

관련 채용 정보