Database/oracle

오라클 트리거(Oracle Trigger)

solarwind3 2025. 3. 30. 12:51
반응형

안녕하세요! 오늘은 오라클 트리거(Oracle Trigger) 에 대해 자세히 알아보겠습니다.

트리거는 데이터베이스 관리에서 매우 유용하게 사용되는 기능 중 하나입니다. 특히, 자동화된 데이터 처리, 무결성 유지, 로깅 등의 용도로 많이 사용됩니다.

이 글에서는 트리거의 개념부터, 종류, 기본 문법, 실전 예제, 그리고 사용 시 주의할 점까지 차근차근 설명해드리겠습니다.


1. 오라클 트리거(Oracle Trigger)란?

✅ 트리거란 무엇인가?

트리거(Trigger)란 특정 이벤트(Event)가 발생하면 자동으로 실행되는 데이터베이스 객체 입니다.

즉, INSERT(삽입), UPDATE(수정), DELETE(삭제) 같은 데이터 변경 작업이 수행될 때, 미리 정해놓은 SQL 문이 자동으로 실행됩니다.

✅ 트리거를 왜 사용할까?

트리거는 여러 가지 이유로 사용됩니다.

트리거의 역할설명
자동화 (Automation) 특정 작업이 발생할 때 자동으로 실행
데이터 무결성 유지 올바른 데이터만 입력되도록 강제
로깅 및 감사(Auditing) 데이터 변경 이력을 기록
비즈니스 규칙 적용 특정 조건에 따라 데이터 변경 제한

2. 오라클 트리거의 종류

트리거는 실행 시점과 이벤트에 따라 여러 종류로 나뉩니다.

✅ 실행 시점에 따른 분류

트리거 유형설명
BEFORE 트리거 이벤트가 발생하기 실행
AFTER 트리거 이벤트가 발생한 실행
INSTEAD OF 트리거 뷰(View)에서 발생한 이벤트를 대체하여 실행

✅ 이벤트에 따른 분류

트리거 유형설명
INSERT 트리거 새로운 데이터가 삽입될 때 실행
UPDATE 트리거 데이터가 수정될 때 실행
DELETE 트리거 데이터가 삭제될 때 실행

👉 조합하여 사용 가능!
예) BEFORE INSERT, AFTER UPDATE, INSTEAD OF DELETE 등


3. 트리거 기본 문법

트리거는 CREATE TRIGGER 문을 사용하여 생성합니다. 기본적인 문법을 살펴볼까요?

CREATE OR REPLACE TRIGGER 트리거_이름  
{ BEFORE | AFTER | INSTEAD OF } { INSERT | UPDATE | DELETE }  
ON 테이블_이름  
[FOR EACH ROW]  
WHEN (조건)  
BEGIN  
    -- 실행할 PL/SQL 코드  
END;
/

✅ 문법 설명

  • CREATE OR REPLACE TRIGGER → 트리거 생성 (기존 트리거가 있으면 덮어씀)
  • {BEFORE | AFTER | INSTEAD OF} → 실행 시점 지정
  • {INSERT | UPDATE | DELETE} → 어떤 이벤트에서 실행할지 지정
  • ON 테이블_이름 → 트리거가 적용될 테이블
  • [FOR EACH ROW] → 행 단위(Row-Level) 실행 여부 지정
  • WHEN (조건) → 특정 조건에서만 실행
  • BEGIN ... END; → 실행할 PL/SQL 코드 블록

4. 트리거 실전 예제

이제 실전 예제를 통해 트리거를 적용해보겠습니다.


✅ 예제 1: 직원 추가 시 로그 남기기

💡 시나리오

회사에서 직원 정보를 관리하는 EMPLOYEES 테이블과 변경 이력을 저장하는 EMPLOYEES_LOG 테이블이 있습니다.

직원이 추가될 때마다 자동으로 로그를 남기는 트리거 를 만들어보겠습니다.

🔹 1️⃣ 먼저 로그 테이블 생성

CREATE TABLE EMPLOYEES_LOG (
    log_id NUMBER PRIMARY KEY,
    emp_id NUMBER,
    log_date DATE DEFAULT SYSDATE,
    action VARCHAR2(50)
);
 
 

🔹 2️⃣ INSERT 트리거 생성

CREATE OR REPLACE TRIGGER trg_emp_insert  
AFTER INSERT  
ON EMPLOYEES  
FOR EACH ROW  
BEGIN  
    INSERT INTO EMPLOYEES_LOG (log_id, emp_id, action)  
    VALUES (EMPLOYEES_LOG_SEQ.NEXTVAL, :NEW.emp_id, 'INSERTED');
END;
/

설명

  • AFTER INSERT ON EMPLOYEES → EMPLOYEES 테이블에 데이터가 추가된 후에 실행
  • FOR EACH ROW → 행 단위로 실행됨
  • :NEW.emp_id → 새로 삽입된 직원 ID를 가져옴
  • EMPLOYEES_LOG 테이블에 자동으로 로그가 기록됨

✅ 예제 2: 급여 제한 트리거 (업데이트 차단)

💡 시나리오

특정 직급의 직원은 급여가 10,000을 초과할 수 없도록 제한하려고 합니다.

🔹 트리거 생성

CREATE OR REPLACE TRIGGER trg_salary_limit  
BEFORE UPDATE  
ON EMPLOYEES  
FOR EACH ROW  
BEGIN  
    IF :NEW.salary > 10000 THEN  
        RAISE_APPLICATION_ERROR(-20001, '급여는 10,000을 초과할 수 없습니다.');
    END IF;  
END;
/

설명

  • BEFORE UPDATE ON EMPLOYEES → 급여 업데이트 전에 실행
  • :NEW.salary → 변경된 급여 값 가져오기
  • RAISE_APPLICATION_ERROR → 급여가 10,000 초과하면 오류 발생

🔥 실행 결과

 
UPDATE EMPLOYEES SET salary = 15000 WHERE emp_id = 1;

ORA-20001: 급여는 10,000을 초과할 수 없습니다.

✅ 트리거 덕분에 잘못된 급여 업데이트가 차단되었습니다!


5. 트리거 관리 (조회 및 삭제)

✅ 트리거 목록 조회

현재 데이터베이스에 있는 트리거를 확인하려면 다음 SQL을 실행하세요.

 
SELECT trigger_name, table_name, status  
FROM user_triggers;

트리거가 필요 없을 경우 삭제할 수 있습니다.

DROP TRIGGER 트리거_이름;

6. 트리거 사용 시 주의할 점

트리거는 강력한 기능이지만, 잘못 사용하면 문제를 일으킬 수도 있습니다.

무한 루프 방지

  • 트리거 내부에서 같은 테이블을 수정하면 무한 루프 가 발생할 수 있습니다.
  • 예를 들어, AFTER UPDATE 트리거에서 같은 테이블을 업데이트하면 트리거가 계속 실행됩니다.

성능 문제 고려

  • 트리거 내부에서 복잡한 연산을 수행하면 성능 저하 가 발생할 수 있습니다.
  • 특히, 대량 데이터가 변경될 때는 주의해야 합니다.

디버깅 어려움

  • 트리거는 자동 실행되므로, 디버깅이 어려울 수 있습니다.
  • 필요하다면 트리거 내부에서 DBMS_OUTPUT.PUT_LINE 을 활용하여 로그를 출력하는 것도 방법입니다.

7. 마무리

오늘은 오라클 트리거에 대해 배웠습니다!

✅ 트리거는 자동화, 데이터 무결성 유지, 로깅 등에 유용합니다.
✅ BEFORE, AFTER, INSTEAD OF 트리거를 적절히 활용할 수 있습니다.
✅ 트리거 사용 시 성능 및 무한 루프 문제 에 주의해야 합니다.

반응형