[Oracle] 트리거(TRIGGER)

후니·2023년 8월 23일

Oracle

목록 보기
1/4

📖 트리거(TRIGGER)란?

  • 데이터베이스 시스템에서 데이터의 입력, 갱신, 삭제 등의 이벤트가 발생할 때마다 자동적으로 수행되는 사용자 정의 프로시저
  • 트리거는 TABLE과 별도로 DATABASE에 저장
  • 트리거는 VIEW가 아닌 TABLE에 관해서만 정의
  • SQL의 제약조건 방법을 통해 명시할 수 없는 무결성 제약 조건을 구현하고, 관련 테이블의 데이터를 일치시킬 때 주로 사용
  • 제약조건과 함께 데이터 무결성을 지키는 하나의 방법으로써 특정 이벤트에 대해 연속적으로 자동 동작하는 특수한 형태의 저장 프로시저

예를 들어 '입고' 테이블에 새로운 제품이 들어오면 그 수량을 '재고' 테이블에 자동으로 반영되게 하는 경우가 있다.

🔥 트리거의 종류

2. 행 트리거

트리거가 설정된 테이블에 트리거 이벤트가 발생하면 많은 행에 대해 변경 작업이 발생하더라도 오직 한 번만 트리거를 발생시키는 방법
(컬럼값 변화가 생길 때마다 알아서 실행 - FOR EACH ROW 옵션은 사용하지 않는다.)

UPDATE STUDENT_TABLE SET grade = grade + 10;
// 다음과 같이 여러 행이 변경될 경우 트리거는 한 번만 실행된다.

2. 행 트리거

조건을 만족하는 여러 개의 행에 대해 트리거를 반복적으로 여러 번 수행하는 방법으로 [FOR EACH ROW WHEN 조건] 절로 정의
(컬럼의 데이터 행이 변화가 오면 실행되며, 변경 후의 행은 OLD와 NEW를 통해 가져올 수 있다.)

✏️ 트리거 구문

CREATE [ OR REPLACE ] TRIGGER 트리거명
BEFORE | AFTER
[ 동작(INSERT, UPDATE, DELETE) ON 테이블명 ]
[ REFERENCING NEW | OLD TABLE AS 테이블명 ]
[ FOR EACH NOW ]
[ WHEN 조건식 ]
[ 트리거 BODY 문 ]
  • OR REPLACE: 생성할 트리거와 같은 이름을 가지고 있어도 무시하고 새로운 것으로 갱신
  • AFTER: 테이블이 변경된 후에 트리거가 실행되는 옵션
  • BEFORE: 테이블이 변경되기 전에 트리거가 실행되는 옵션
  • 동작옵션: 각각 INSERT, UPDATE, DELETE가 실행될 때 트리거를 실행
  • NEW: 새로 추가되거나 변경된 후의 값에 트리거가 적용 (INSERT : 입력할 값, UPDATE: 수정할 값)
  • OLD: 변경 전의 값에 트리거가 적용 (UPDATE: 수정 전 값, DELETE: 삭제할 값)
  • WHEN: 트리거가 실행되면서 지켜야 할 조건 지정 (조건에 맞는 데이터만 트리거 실행)
  • 트리거 BODY문: 트리거의 본문 코드를 입력하는 부분 (BEGIN으로 시작해서 END로 끝나며, 하나 이상의 SQL 문이 있어야 한다. 없을 경우 오류 발생)

✏️ 예제

CREATE OR REPLACE TRIGGER ORACLE_TRIGGER
BEFORE
INSERT ON STUDENT_TABLE
REFERENCING NEW TABLE AS NEW_TRIGGER
FOR EACH ROW
WHEN NEW_TRIGGER.점수 = ''
BEGIN
	SET NEW_TABLE.점수 = '0';
END

값이 입력되기 전에 공백, null로 입력되는 점수에 대해서 0으로 바꿔주는 트리거를 적용시키는 쿼리문이다.

트리거의 제한

  • 트리거는 트랜잭션 제어문 (COMMIT, ROLLBACK, SAVEPOINT)을 사용할 수 없다.
  • 트리거는 트리거링 문장의 실행 부분으로써 실행되는 트리거링 문장과 같은 트랜잭션에 있다.
  • 트리거가 걸려있는 대상(트리거링) 문장이 COMMIT, ROLLBACK 될 때 트리거의 작업 역시 COMMIT, ROLLBACK 된다.

출처 : https://mine-it-record.tistory.com/107

profile
Developer

0개의 댓글