메뉴 여닫기
개인 메뉴 토글
로그인하지 않음
만약 지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
편집 요약 없음
 
7번째 줄: 7번째 줄:
=== 트리거 기본 개념 ===
=== 트리거 기본 개념 ===


{| class=”wikitable“
{| class="wikitable"
|+ Oracle 트리거 기본개념
|-
|-
! 항목 !! 설명
! 항목 !! 설명
18번째 줄: 19번째 줄:
|-
|-
| 적용 대상 || 행(Row-Level) / 문장(Statement-Level)
| 적용 대상 || 행(Row-Level) / 문장(Statement-Level)
|-
|}
|}



2025년 6월 23일 (월) 00:13 기준 최신판

트리거

  • Oracle 트리거(Trigger)는 특정 이벤트가 발생했을 때 자동으로 실행되는 PL/SQL 블록입니다.
  • 예를 들어, INSERT/UPDATE/DELETE가 발생할 때 자동으로 특정 로직을 실행할 수 있도록 설정합니다.


트리거 기본 개념

Oracle 트리거 기본개념
항목 설명
정의 특정 이벤트에 자동으로 반응하는 데이터베이스 객체
작동 시점 BEFORE / AFTER / INSTEAD OF
대상 이벤트 INSERT, UPDATE, DELETE
적용 대상 행(Row-Level) / 문장(Statement-Level)

기본 문법


CREATE [OR REPLACE] TRIGGER 트리거명
{BEFORE | AFTER | INSTEAD OF} {INSERT | UPDATE | DELETE}
ON 테이블명
[FOR EACH ROW] -- 행 단위 트리거일 경우
[WHEN 조건]    -- (선택적 조건)
BEGIN
  -- 실행할 PL/SQL 블록
END;
/


예제 1

INSERT 발생 시 로그 기록 트리거

CREATE OR REPLACE TRIGGER trg_customer_insert_log
AFTER INSERT ON CUSTOMER
FOR EACH ROW
BEGIN
  INSERT INTO CUSTOMER_LOG (CUST_ID, ACTION_DATE, ACTION)
  VALUES (:NEW.ID, SYSDATE, 'INSERT');
END;
/
  • CUSTOMER 테이블에 데이터가 추가될 때, CUSTOMER_LOG 테이블에 로그를 남깁니다.

예제 2

급여 변경 감지 트리거 (UPDATE)

CREATE OR REPLACE TRIGGER trg_salary_change
BEFORE UPDATE OF SALARY ON EMPLOYEE
FOR EACH ROW
WHEN (OLD.SALARY != NEW.SALARY)
BEGIN
  INSERT INTO SALARY_AUDIT (EMP_ID, OLD_SALARY, NEW_SALARY, CHANGE_DATE)
  VALUES (:OLD.EMP_ID, :OLD.SALARY, :NEW.SALARY, SYSDATE);
END;
/
  • 급여가 변경되면 SALARY_AUDIT 테이블에 변경 전/후 정보를 기록합니다.

예제 3

DELETE 시 데이터 백업 트리거

CREATE OR REPLACE TRIGGER trg_emp_delete_backup
BEFORE DELETE ON EMPLOYEE
FOR EACH ROW
BEGIN
  INSERT INTO EMPLOYEE_ARCHIVE (EMP_ID, NAME, DEPT_ID, SALARY, DELETED_AT)
  VALUES (:OLD.EMP_ID, :OLD.NAME, :OLD.DEPT_ID, :OLD.SALARY, SYSDATE);
END;
/
  • 삭제 전 데이터를 백업 테이블로 복사합니다.
  • 실무에서 데이터 삭제 로그를 남기기 위해 자주 사용합니다.

트리거 종류 요약

Oracle 19c 트리거 종류 요약
종류 설명 사용 예
BEFORE INSERT/UPDATE/DELETE 이벤트 발생 전에 실행 BEFORE UPDATE ON EMPLOYEE
AFTER INSERT/UPDATE/DELETE 이벤트 발생 후에 실행 AFTER INSERT ON CUSTOMER
INSTEAD OF 뷰(View)에 직접 수정이 불가할 때 대체 실행 INSTEAD OF INSERT ON vw_customer
STATEMENT 트리거 전체 문장 1회 실행 (행마다 아님) CREATE TRIGGER trg_all AFTER INSERT ON table
ROW 트리거 각 행마다 실행됨 FOR EACH ROW 사용



시스템 트리거 (고급)

Oracle은 테이블 외에도 시스템 이벤트 트리거를 지원합니다:


CREATE OR REPLACE TRIGGER trg_logon_example
AFTER LOGON ON DATABASE
BEGIN
  INSERT INTO LOGIN_AUDIT(USER_NAME, LOGIN_TIME)
  VALUES (USER, SYSDATE);
END;
/
  • 사용자가 데이터베이스에 접속할 때마다 로그인 기록을 남깁니다.

트리거 유의사항

주의사항 설 명
트리거는 자동 실행되므로, 무한 루프 주의 예: 트리거에서 다시 트리거를 부르는 경우
트리거는 성능에 영향을 줄 수 있음 많은 데이터에 작동하면 병목 발생 가능
트리거는 디버깅이 어렵기 때문에 주석, 로그 중요 로그 테이블 또는 DBMS_OUTPUT 활용 권장