본문 바로가기
SQL

SQL: 트리거(Trigger)

by lcwJAVA 2024. 8. 19.

트리거는 특정  테이블에서 INSERT, UPDATE, DELETE 와 같은  DML 문이 실행될때,

즉 테이블의 이벤트가 발생했을때 자동으로 특정 작업을 수행하도록 미리 정의해두는 객체이다.

예를 들어, 회원 탈퇴 시 회원 정보를 다른 테이블로 자동으로 옮기거나, 

상품의 입출고 기록이 생성될 때마다 재고 수량을 자동으로 업데이트하는 등의 작업을 자동화할 수 있다


트리거의 종류

  • 실행 시기에 따른 분류:
    • BEFORE 트리거: 이벤트가 발생하기 전에 실행
    • AFTER 트리거: 이벤트가 발생한 후에 실행
  • SQL 문이 영향을 미치는 행에 따른 분류:
    • 문장 트리거(Statement Trigger): 이벤트가 발생한 SQL 문에 대해 딱 한 번 실행
    • 행 트리거(Row Trigger): 이벤트가 발생한 각 행에 대해 한 번씩 실행
      • :OLD - BEFORE UPDATE(수정전 자료), BEFORE DELETE(삭제전 자료)
      • :NEW - AFTER INSERT(추가된 자료), AFTER UPDATE(수정후 자료)

트리서 생성 구문

1
2
3
4
5
6
7
8
CREATE [OR REPLACE] TRIGGER 트리거명
BEFORE | AFTER INSERT | UPDATE | DELETE ON 테이블명
[FOR EACH ROW]
BEGIN
    -- 실행할 내용
END;
/
 
cs

 


트리거 예시

 

1 EMPLOYEE 테이블에 새로운 행이 삽입될 때마다 메시지를 출력하는 트리거

1
2
3
4
5
6
7
CREATE OR REPLACE TRIGGER TRG_01
AFTER INSERT ON EMPLOYEE
BEGIN
    DBMS_OUTPUT.PUT_LINE('신입사원님 안녕하세요.');
END;
/
 
cs

 

2 상품 입출고 제거 수량을 자동으로 관리하는 트리거

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CREATE OR REPLACE TRIGGER TRG_02
AFTER INSERT ON TB_PRODETAIL
FOR EACH ROW
BEGIN
    IF(:NEW.STATUS = '입고')
        THEN UPDATE TB_PRODUCT
             SET STOCK = STOCK + :NEW.AMOUNT
             WHERE PCODE = :NEW.PCODE;
    END IF;
    
    IF(:NEW.STATUS = '출고')
        THEN UPDATE TB_PRODUCT
             SET STOCK = STOCK - :NEW.AMOUNT
             WHERE PCODE = :NEW.PCODE;
    END IF;
END;
/
 
cs

'SQL' 카테고리의 다른 글

SQL : PL/SQL  (0) 2024.08.19
SQL : VIEW 뷰  (0) 2024.08.19
SQL: ETC(DCL, TCL)  (0) 2024.08.19
SQL: DDL(ALTER/ DROP)  (0) 2024.08.18
SQL : DML(INSERT/ UPDATE/ DELETE)  (0) 2024.08.17