728x90
1. 트리거란 무엇인가?
Oracle에서 트리거(Trigger)는 특정 이벤트(INSERT, UPDATE, DELETE 등)가 발생할 때 자동으로 실행되는 PL/SQL 코드 블록입니다. 트리거는 데이터 무결성 유지, 감사 로그 기록, 자동 계산 등의 작업에 사용됩니다.
2. 트리거의 구성 요소
- 트리거 이벤트: INSERT, UPDATE, DELETE
- 트리거 시점: BEFORE 또는 AFTER
- 트리거 대상: 테이블 또는 뷰
- 트리거 본문: 실행할 PL/SQL 문장
3. 기본 예제: BEFORE INSERT 트리거
CREATE OR REPLACE TRIGGER trg_before_insert_employee
BEFORE INSERT ON employees
FOR EACH ROW
BEGIN
:NEW.created_at := SYSDATE;
END;
/
설명: 이 트리거는 employees 테이블에 레코드가 삽입되기 전에 자동으로 created_at
필드에 현재 날짜를 입력합니다.
4. AFTER UPDATE 트리거 예제: 변경 로그 기록
CREATE OR REPLACE TRIGGER trg_after_update_salary
AFTER UPDATE OF salary ON employees
FOR EACH ROW
BEGIN
INSERT INTO salary_log(emp_id, old_salary, new_salary, changed_at)
VALUES (:OLD.emp_id, :OLD.salary, :NEW.salary, SYSDATE);
END;
/
설명: 직원의 급여가 변경될 경우, 변경 전/후 정보를 salary_log 테이블에 저장합니다.
5. BEFORE DELETE 트리거 예제: 삭제 방지
CREATE OR REPLACE TRIGGER trg_prevent_delete_ceo
BEFORE DELETE ON employees
FOR EACH ROW
BEGIN
IF :OLD.job_title = 'CEO' THEN
RAISE_APPLICATION_ERROR(-20001, 'CEO는 삭제할 수 없습니다.');
END IF;
END;
/
설명: CEO 직책을 가진 직원은 삭제할 수 없도록 제한합니다.
6. 트리거 유형 비교
트리거 유형 | 설명 | 적용 시점 | 대표 예제 |
---|---|---|---|
BEFORE INSERT | 삽입 전 자동 처리 | 데이터 검증/기본값 설정 | created_at := SYSDATE |
AFTER UPDATE | 수정 후 처리 | 감사 로그 저장 | salary_log 기록 |
BEFORE DELETE | 삭제 전 검증 | 삭제 방지 | CEO 삭제 방지 |
7. 트리거 사용 시 주의사항
- 무한 루프 발생 가능성: 트리거 내에서 같은 테이블을 갱신하는 경우 주의
- 성능 저하: 복잡한 로직은 시스템 성능에 영향을 줄 수 있음
- 디버깅 어려움: 트리거 오류는 실행 시점에 발생하므로 원인 추적이 어려움
8. 트리거 관리 및 삭제
-- 트리거 상태 비활성화
ALTER TRIGGER trg_before_insert_employee DISABLE;
-- 트리거 삭제
DROP TRIGGER trg_before_insert_employee;
9. 활용 예시 요약
- 입력값 자동 처리: 등록일, 고유 ID 등 자동 생성
- 로그 기록: 변경 이력 자동 저장
- 업무 규칙 강제: 중요 데이터 보호, 조건부 삭제 차단
10. 마무리: 트리거의 현명한 사용
트리거는 자동화와 무결성 유지에 매우 강력한 도구입니다. 다만, 설계 초기부터 명확한 로직으로 관리하지 않으면 시스템 유지보수에 어려움을 초래할 수 있으므로 신중한 설계와 철저한 테스트가 필수입니다.
출처
- Oracle 공식 문서: https://docs.oracle.com/en/database/
- Oracle PL/SQL Programming - Steven Feuerstein
- 실무 중심 Oracle SQL & PL/SQL - 김상현 저
728x90
'Oracle > Etc' 카테고리의 다른 글
[ORACLE] PROFILE() 비밀번호 정책과 로그인 제한을 한 번에 설정하는 법 (0) | 2025.06.08 |
---|---|
[ORACLE] ROLE() 실무 예제로 배우는 권한 관리의 핵심 기초 (0) | 2025.06.08 |
[ORACLE] DELETE() 문법 완전 정리 : 실무에서 자주 쓰는 예제로 배우기 (0) | 2025.06.08 |
[ORACLE] UPDATE() 기본 문법부터 실전 예제까지 완전 정리 (0) | 2025.06.08 |
[ORACLE] MERGE() 문법 완전 정리 : INSERT와 UPDATE를 동시에 처리하기 (0) | 2025.06.08 |