본문 바로가기

Database/Oracle

오라클(ORACLE) 데이터 추가 시 다른 테이블(TABLE)에도 삽입하는 트리거(TRIGGER)

오라클(ORACLE) 트리거(TRIGGER)

ORACLE(오라클) 특정 테이블(TABLE)에 데이터가 추가(INSERT)될 경우 다른 테이블(TABLE)에도 데이터를 자동으로 추가되도록 하기 위해 TRIGGER(트리거)를 사용해 보자.

TRIGGER

TRIGGER(트리거)는 데이터(TABLE 또는 VIEW)의 입력(INSERT), 수정(UPDATE), 삭제(DELETE) 등의 이벤트가 발생할 때 마다 자동으로 수행되는 사용자 정의 프로시저(Procedure, 절차)이다. PROCEDURE(프로시저)나 FUNCTION(함수)는 호출을 해야 하지만, TRIGGER(트리거)는 자동으로 처리된다. CONSTRAINT(제약조건)과 함께 데이터 무결성(Data Integrity)을 유지하는 방법이다.

TRIGGER 종류

TRIGGER문장 트리거(State Level Trigger), 행 트리거(Row Level Trigger) 두 가지 종류로 나눌 수 있다.

Statement Level Trigger(문장 트리거)

문장 트리거(State Level Trigger)는 TRIGGER가 설정된 TABLE이벤트발생할 경우, 많은 행(Row)에 대하여 변경 작업이 발생하더라도 오직 한 번TRIGGER처리한다. (Column)에 이벤트발생할 때마다 실행되는 방식이다.

FOR EACH ROW 옵션선언하지 않으면 문장 트리거(State Level Trigger)로 선언된다.

Row Level Trigger(행 트리거)

행 트리거(Row Level Trigger)는 조건만족하는 여러 개의 행(Row)에 대하여 TRIGGER반복적으로 여러번 실행되는 방식이다.

FOR EACH ROW 옵션선언하면 행 트리거(Row Level Trigger)로 선언된다. 데이터 (Row)이 변화될 때 마다 실행되는 방식이다.

TRIGGER 형식

TRIGGER는 기본 형식은 아래와 같다.

CREATE [OR REPLACE] TRIGGER <트리거 명>
BEFORE | AFTER
[INSERT | UPDATE | DELETE] ON <테이블 명>
[REFERENCING NEW | OLD TABLE AS <테이블 명>]
[FOR EACH ROW]
[WHEN <조건식>]
BEGIN
    <트리거 본문>
END
  • OR REPLACE
    생성할 트리거 명이 이미 있을 경우 기존의 트리거갱신한다.
  • BEFORE
    테이블이 변경되기 트리거실행한다.
  • AFTER
    테이블이 변경 트리거실행된다.
  • NEW
    새로 추가되거나 변경데이터트리거적용된다.
  • OLD
    추가되거나 변경되기 데이터트리거적용된다.
  • FOR EACH ROW
    행 트리거로 지정한다.
  • WHEN
    트리거실행될 때 특정 조건데이터에만 트리거를 지정한다.

TRIGGER 예제

테스트를 위한 테이블들을 생성한다.

-- 테스트를 위한 임시 테이블 생성
CREATE TABLE EMPLOYEES
(
    EMP_SEQ   NUMBER               NOT NULL,
    EMP_NAME  VARCHAR2(50)         NOT NULL,
    EMP_PHONE VARCHAR2(12)         NOT NULL,
    EMP_JOIN  DATE DEFAULT SYSDATE NOT NULL,
    CONSTRAINT EMPLOYEES_PK PRIMARY KEY (EMP_SEQ)
);
-- 시퀀스 생성
CREATE SEQUENCE EMPLOYEES_SEQ START WITH 10001 INCREMENT BY 1 NOMAXVALUE NOCYCLE NOCACHE;

-- 트리거 테스트를 위한 임시 테이블 생성
CREATE TABLE MESSAGE
(
    MSG_SEQ NUMBER               NOT NULL,
    MSG_PHONE VARCHAR2(12)       NOT NULL,
    MSG_TEXT VARCHAR2(1000)      NOT NULL,
    MSG_REQ DATE DEFAULT SYSDATE NOT NULL,
    CONSTRAINT MESSAGE_PK PRIMARY KEY (MSG_SEQ)
);
-- 시퀀스 생성
CREATE SEQUENCE MESSAGE_SEQ START WITH 1 INCREMENT BY 1 NOMAXVALUE NOCYCLE NOCACHE;

EMPLOYEES 테이블에 데이터가 추가될 경우 자동으로 MESSAGE 테이블에 데이터가 추가될 수 있도록 아래와 같이 트리거생성한다.

CREATE OR REPLACE TRIGGER TR_WELCOME
    AFTER INSERT ON EMPLOYEES
    FOR EACH ROW
    BEGIN
        INSERT INTO MESSAGE
            (MSG_SEQ, MSG_PHONE, MSG_TEXT)
        VALUES
            (MESSAGE_SEQ.nextval, :NEW.EMP_PHONE, '환영합니다. ' || :NEW.EMP_NAME || '님!');
    END;

생성된 트리거 확인을 위하 아래의 쿼리문을 실행한다.

SELECT * FROM USER_TRIGGERS;

트리거 테스트를 위해 EMPLOYEES 테이블에 데이터추가한다.

INSERT INTO EMPLOYEES
    (EMP_SEQ, EMP_NAME, EMP_PHONE)
    VALUES
    (EMPLOYEES_SEQ.nextval, '홍길동', '01012341234');

트리거가 정상 실행되었는지 확인한다.

SELECT * FROM EMPLOYEES;
SELECT * FROM MESSAGE;
SELECT * FROM EMPLOYEES
EMP_SEQ EMP_NAME EMP_PHONE EMP_JOIN
10001 홍길동 01012341234 2024-01-11 19:39:59
SELECT * FROM MESSAGE
MSG_SEQ MSG_PHONE MSG_TEXT MGS_REQ
1 01012341234 환영합니다. 홍길동님! 2024-01-11 19:39:59

EMPLOYEES 테이블데이터추가하면, MESSAGE 테이블데이터자동으로 추가되는 것을 확인할 수 있다.