1. 트리거란?
트리거(Trigger)는 데이터베이스에서 INSERT, UPDATE, DELETE 같은 이벤트가 발생했을 때 자동으로 실행되는 프로시저다.
즉, 사용자가 직접 실행하지 않아도, 특정 조건이 충족되면 DB가 알아서 동작한다.
트리거의 주요 특징
- 사용자의 명시적 호출 없이 자동으로 실행됨
- 데이터의 무결성과 일관성 유지
- 복잡한 업무 규칙을 자동으로 구현 가능
- 다른 테이블과의 연계 작업 자동화 가능
2. 트리거의 종류
(1) 실행 시점에 따른 분류
- BEFORE 트리거: DML 문이 실행되기 직전에 작동
- AFTER 트리거: DML 문이 실행된 후에 작동
(2) 이벤트에 따른 분류
- INSERT 트리거: 데이터가 삽입될 때 실행
- UPDATE 트리거: 데이터가 수정될 때 실행
- DELETE 트리거: 데이터가 삭제될 때 실행
3. 트리거 문법 구조
CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON table_name
[FOR EACH ROW]
[WHEN condition]
DECLARE
-- 변수 선언부
BEGIN
-- 실행부
EXCEPTION
-- 예외 처리부
END;
/
주요 구성 요소 설명
- OR REPLACE: 같은 이름의 트리거가 있으면 새로 덮어씀
- FOR EACH ROW: 행 단위로 실행할지 여부 지정
- 행 레벨 트리거: 영향을 받는 각 행마다 실행 (예: 10행 수정 시 10번 실행)
- 문장 레벨 트리거: SQL 문장 단위로 한 번만 실행
- WHEN: 특정 조건일 때만 트리거를 작동시킴
4. 트리거에서 사용되는 레퍼런스 (:OLD, :NEW)
행 레벨 트리거에서는 :OLD, :NEW라는 의사 레코드(Pseudo Record) 를 사용한다.
참조 INSERT UPDATE DELETE
| :OLD | NULL | 변경 전 값 | 삭제될 값 |
| :NEW | 삽입될 값 | 변경 후 값 | NULL |
즉,
- :OLD → 기존 데이터
- :NEW → 새로 들어오거나 수정된 데이터
5. 트리거 예제
(1) 급여 변경 로그 기록
CREATE OR REPLACE TRIGGER trg_salary_log
AFTER UPDATE OF salary ON employees
FOR EACH ROW
BEGIN
INSERT INTO salary_log (
emp_id,
changed_date,
old_salary,
new_salary
) VALUES (
:NEW.employee_id,
SYSDATE,
:OLD.salary,
:NEW.salary
);
END;
/
직원의 급여가 바뀔 때마다 salary_log 테이블에 변경 이력을 자동으로 저장한다.
(2) 새로운 직원 입사 시 로그 기록
CREATE OR REPLACE TRIGGER trg_new_employee_log
AFTER INSERT ON employees
FOR EACH ROW
BEGIN
INSERT INTO employee_log (
emp_id,
hire_date,
department_id,
position,
action_type
) VALUES (
:NEW.employee_id,
:NEW.hire_date,
:NEW.department_id,
:NEW.job_id,
'NEW_HIRE'
);
UPDATE department_stats
SET employee_count = employee_count + 1
WHERE department_id = :NEW.department_id;
END;
/
새로운 직원이 등록될 때 자동으로 employee_log에 입사 기록을 추가하고,
해당 부서의 인원수를 1 증가시킨다.
6. 트리거 관리 명령어
(1) 트리거 확인
SELECT trigger_name, trigger_type, triggering_event
FROM user_triggers
WHERE table_name = 'TABLE_NAME';
(2) 트리거 활성화 / 비활성화
ALTER TRIGGER trigger_name ENABLE; -- 활성화
ALTER TRIGGER trigger_name DISABLE; -- 비활성화
(3) 트리거 삭제
DROP TRIGGER trigger_name;
7. 트리거 사용 시 주의사항
- 트리거 내부에서 COMMIT, ROLLBACK 사용 불가
- 트리거 간 무한 루프 발생 주의 (서로 호출하는 경우)
- 성능 저하 가능성 고려 (특히 대용량 테이블에서)
- 디버깅이 어려움 → 로그 테이블 활용 추천
- 명확한 목적을 가진 트리거만 사용하기
'DBMS > 개념' 카테고리의 다른 글
| 28_ Oracle 사용자 정의 함수 (0) | 2025.11.03 |
|---|---|
| 27_ DCL (Data Control Language) (0) | 2025.11.01 |
| 25_ 정규표현식(Regular Expression) (0) | 2025.10.28 |
| 24_ DBMS 심화 주제 (0) | 2025.10.26 |
| 23_ CASE문 (0) | 2025.10.24 |