대덕인재/Oracle

[Oracle D-20] 트리거(trigger)

꼬마버거 2025. 4. 28. 12:50

트리거(trigger)
"특정 이벤트가 발생했을 때 자동으로 실행되는 DB 프로그램" 이야.

쉽게 말하면:

누가 테이블에 INSERT, UPDATE, DELETE 하면
자동으로 뒤에서 숨어서 작동하는 감시자 코드!


📦 예시 비유

  • 누군가 회원가입을 하면 → "자동으로 가입 로그 테이블에 기록"
  • 누군가 상품을 삭제하면 → "자동으로 관련 재고도 삭제"

즉, 프로그래머가 직접 호출하지 않아도 DB가 알아서 호출함

🔧 Oracle 기준 트리거 기본 형태

CREATE OR REPLACE TRIGGER 트리거이름
AFTER INSERT OR UPDATE OR DELETE
ON 테이블명
FOR EACH ROW
BEGIN
    -- 여기에 자동으로 실행할 SQL 코드 작성
    INSERT INTO LOG_TABLE (내용) VALUES ('회원 정보 변경됨');
END;
 

💡 트리거 실행 시점 종류

 

키워드 의미
BEFORE INSERT/UPDATE/DELETE 되기 전에 실행
AFTER INSERT/UPDATE/DELETE 된 후 실행
INSTEAD OF 보통 뷰(View)에서 사용. 대신 실행됨

📌 언제 쓰면 좋을까?


상황 설명
데이터 변경 기록 로그 남기기 자동화
제약 조건 강제 특정 조건을 위반하면 에러 발생
자동 계산 가격 수정 시 자동 합계 계산
감시와 통제 민감 테이블에 무단 접근 추적

🚫 하지만 주의할 점

  • 남용 금지: 너무 많이 만들면 성능 떨어짐
  • 순서 충돌: 여러 트리거가 서로 영향을 줄 수 있음
  • 디버깅 어려움: 자동으로 실행되니까 디버깅이 힘듦

❗ Java에서 비슷한 건 없나?

  • Java에는 트리거 자체는 없지만,
  • 이벤트 리스너 (ActionListener, MouseListener 등) 같은 개념이 유사한 역할을 해.
  • 하지만 DB 수준에서 자동 실행되는 건 DB 트리거가 전담해.

✨ 요약

| 트리거란? | 데이터베이스에서 특정 이벤트(INSERT 등)가 발생하면 자동으로 실행되는 코드 | | 어디에 쓰나? | 로그, 감사, 데이터 보호, 자동 처리 | | Java에 있나? | ❌ Java 자체엔 없음. DB 전용 개념임 |

 

📚 트리거 예제 (회원가입 기록 남기기)

상황 가정:

  • MEMBER 테이블에 회원 가입(insert) 이 일어날 때마다
  • MEMBER_LOG 테이블에 "회원이 가입했다" 라는 기록을 자동으로 남기기

 

1. 테이블 먼저 만들기

-- 🧱 회원 테이블 만들기
CREATE TABLE MEMBER (
    MEMBER_ID VARCHAR2(20),   -- 회원 아이디
    MEMBER_NAME VARCHAR2(50)  -- 회원 이름
);

-- 📄 회원 가입 기록 테이블 만들기
CREATE TABLE MEMBER_LOG (
    LOG_ID NUMBER GENERATED ALWAYS AS IDENTITY, -- 자동 증가하는 로그 번호
    MEMBER_ID VARCHAR2(20),   -- 가입한 회원 아이디
    ACTION VARCHAR2(100),     -- 어떤 행동을 했는지 기록 (가입함 등)
    ACTION_DATE DATE DEFAULT SYSDATE -- 언제 행동했는지 (기본값: 현재시간)
);

2. 트리거 만들기

-- 🎯 트리거 생성
CREATE OR REPLACE TRIGGER trg_member_insert_log
AFTER INSERT             -- INSERT가 끝난 "뒤에" 실행된다
ON MEMBER                -- MEMBER 테이블에 대해 감시한다
FOR EACH ROW             -- 한 줄(레코드)마다 작동한다
BEGIN
    -- 👇 INSERT가 발생했을 때 자동으로 MEMBER_LOG에 기록 남기기
    INSERT INTO MEMBER_LOG (MEMBER_ID, ACTION)
    VALUES (:NEW.MEMBER_ID, '회원가입 완료');
    -- :NEW는 삽입된 데이터의 값을 가리킨다.
END;
/

3. 사용 예시

-- 🌱 새로운 회원 가입
INSERT INTO MEMBER (MEMBER_ID, MEMBER_NAME)
VALUES ('hong123', '홍길동');

-- ✅ 가입되면, 자동으로 MEMBER_LOG에도 기록 남음
SELECT * FROM MEMBER_LOG;

결과 (로그 테이블):


 

LOG_ID MEMBER_ID ACTION ACTION_DATE
1 hong123 회원가입 완료 2025-04-29 13:00

✨ 중요한 부분 주석 요약


 

코드 설명
CREATE OR REPLACE TRIGGER 트리거를 새로 만들거나 수정한다
AFTER INSERT INSERT 끝난 뒤에 작동
ON 테이블명 어느 테이블을 감시할지 지정
FOR EACH ROW 데이터 한 줄마다 트리거 실행
:NEW.컬럼명 새로 추가된 값 읽을 때 사용
INSERT INTO 로그 테이블에 새로운 기록을 추가

🔥 최종 요약

  • MEMBER 테이블에 누가 회원가입하면
  • 자동으로 MEMBER_LOG 테이블에 "회원가입 완료" 기록이 들어감
  • 우리는 트리거 덕분에 일일이 INSERT 안 해도 된다!

📢 주의할 점

  • 트리거는 자동으로 작동하니까 몰래 실행된다. (코드에 별도로 호출하는 코드가 없음)
  • 만약 트리거가 많아지면, 디버깅이 어려워질 수 있다.
  • 실무에서는 정말 필요한 곳에만 트리거를 쓴다!

 

✅ "한 줄 요약"

트리거는 테이블에 변화가 생길 때, 자동으로 작동하는 스파이 같은 프로그램이다!