INSERT
, UPDATE
, DELETE
쿼리가 수행될 때,PROCEDURE
의 일종COL
의 각 ROW
에서 값 변화가 생길때마다 실행:old
, :new
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
트리거에서는 사용될 수 없음AUTOCOMMIT
: COMMIT
, ROLLBACK
불가능-1
→ 수익 +1
logging
)PROCEDURE
: 사용자가 직접 호출해야만 실행되는 DB 내의 서브 프로그램
→ 즉, 내가 원할 때! 실행
: 명시적으로 특정 작업 수행, 업무 로직을 명확히 구현할 때
→ 비즈니스 로직 수행 시 많이 사용
TRIGGER
: 특정 DML이벤트 발생에 따라 자동으로 실행되는 프로그램
: 업무상 복잡한 계산 처리, 데이터 변경에 따른 자동 업데이트
→ 데이터 상태 관리, 무결성 유지, 로그 기록 시 주로 사용
항목 | Procedure | Trigger |
---|---|---|
호출 방법 | 직접 호출 | 자동 실행 |
COMMIT/ROLLBACK | 가능 | 불가능 |
사용 목적 | 명시적 업무 로직 처리 | 자동화된 이벤트 처리 |
유지보수 용이성 | 좋음 | 다소 어려움 |
성능 최적화 | 관리 쉬움 | 관리 어려울 수 있음 |
트랜잭션 관리 | 명시적 제어 가능 | 자동 제어 |
트리거는 편리하지만 과도한 사용으로 DB성능 저하를 초래함.
프로시저는 관리가 쉽고 로직 명확성이 뛰어남.
일반적으로 프로시저를 더 많이 사용
WHEN
절을 통해 트리거 실행 조건을 제한, 불필요한 트리거 호출 방지WHEN
절 내에 트리거 실행 조건을 명확화create or replace trigger trg_name
after update of salary on table_a
for each row
WHEN (OLD.salary <> NEW.salary) -- salary가 실제 변경 될 때만 실행
[참고자료]