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
테이블에 데이터가 자동으로 추가되는 것을 확인할 수 있다.