[ORACLE]오라클_트리거(TRIGGER)[나만의 기록들]
Trigger는 DBMS에서 Data의 입력, 갱신, 삭제 등의 Event가 발생할 때 마다,
자동으로 수행되는 사용자 정의 Procedure이다.
Procedure나 사용자 정의 함수(UDF)는 사용자가 직접 호출해야만 하지만,
Trigger는 사용자에게 알려주지 않고 자동으로 호출하여 처리한다.
Trigger는 Table과 별도로 DB에 저장된다.
Trigger는 View가 아닌 Table에 관해서만 정의할 수 있다.
일반적으로 Trigger는 SQL 제약 조건 방법을 통해 명시 불가능한 무결성 제약 조건을 구현,
관련 Table Data를 일치시킬 때 주로 사용한다.
제약 조건(Constraint)과 함께 데이터 무결성(Data Integrity)을 유지하는 방법으로,
특정 Event에 대해 자동으로 연속적 동작을 수행하는 형태의 저장 Procedure라고 볼 수 있다.
Trigger는 문장 트리거, 행 트리거 두 가지 종류로 나눌 수 있다.
문장 트리거(Statement Level Trigger)는 Trigger가 설정된 Table에 Trigger Event가 발생할 경우,
많은 행(Row)에 대해 변경 작업이 발생하더라도,
오직 한번의 Trigger를 발생시키는 종류의 Trigger이다.
Column 값에 변화가 발생할 때마다 실행되는 방식이다.
FOR EACH ROW 옵션을 선언하지 않으면 문장 트리거로 선언된다.
만약 아래와 같은 SQL 문장이 실행되며 여러 행이 변경될 경우 단 한번만 실행된다.
update TB_TEST
set log = log + 1;
행 트리거(Row Level Trigger)는 조건을 만족하는 여러 개의 Row에 대해,
Trigger를 반복적으로 여러번 수행하는 방식이다.
FOR EACH ROW 옵션을 선언하면 행 트리거로 지정 할 수 있다.
FOR EACH ROW WHEN 조건 절로 정의된다.
Column Data 행에 변화가 올 때 마다 실행되는 방식이다.
변경 후 행을 OLD, NEW를 통해 가져 올 수 있다.
Trigger는 트랜잭션 제어문(COMMIT, ROLLBACK, SAVEPOINT)를 사용할 수 없다.
Trigger는 Triggering 문장의 실행 부분으로, Triggering 문장과 같은 트랜잭션에 존재한다.
Triggering 문장 : Trigger가 걸려 있는 대상 문장
Triggering 문장이 COMMIT, ROLLBACK 될 때,
Trigger의 작업 또한 COMMIT, ROLLBACK 된다.
Trigger는 기본적으로 아래와 같은 형식을 지닌다.
CREATE [OR REPLACE] TRIGGER `트리거 명`
BEFORE | AFTER
[INSERT, UPDATE, DELETE(동작)] ON `테이블 명`
[REFERENCING NEW | OLD TABLE AS `테이블 명`]
[FOR EACH ROW]
[WHEN 조건식]
Trigger Body
위 형식에서 사용된 옵션들의 설명은 아래와 같다.
| 옵션 | 설명 |
|---|---|
| OR REPLACE | 생성할 Trigger와 같은 이름을 가지고 있어도, 무시하고 새로운 것으로 갱신 |
| BEFORE | TABLE이 변경되기 전 Trigger가 실행 |
| AFTER | TABLE이 변경된 후 Trigger가 실행 |
| 동작 | INSERT, UPDATE, DELETE 등 해당 동작이 실행 될 때 Trigger가 실행 |
| NEW | 새로 추가, 변경 된 후의 값에 Trigger가 적용 INSERT:입력하려는 값, UPDATE:수정 하려는 값 |
| OLD | 변경 되기 전의 값에 Trigger가 적용 UPDATE:수정 전 값, DELETE:삭제할 값 |
| FOR EACH ROW | 행 트리거로 설정 한다. |
| WHEN | Trigger가 실행 될 때 특정 조건 Data에만 Trigger를 지정하는 조건 값 |
| Trigger Body | 트리거 본문 코드 입력 부분 BEGIN으로 시작, END로 끝날 때 하나 이상의 SQL문이 존재해야 한다. 변수에 값을 치환할 때 예약어 SET 사용 |
CREATE OR REPLACE TRIGGER gillog_triger
BEFORE
INSERT, UPDATE ON `TB_GILLOG`
FOR EACH ROW
BEGIN
DBMS_OUTPUT.PUT_LINE('변경 전 타이틀 : ' || : old.title);
DBMS_OUTPUT.PUT_LINE('변경 후 타이틀 : ' || : new.title);
END;
// DBMS_OUTPUT.PUT_LINE을 출력 설정
SQL> SET SERVEROUTPUT ON ;
// UPDATE문 실행
SQL> UPDATE TB_GILLOG SET title = '211110 Trigger 길로그' WHERE logid = 1412
// Trigger가 자동 실행 결과가 출력
변경 전 타이틀 : 2a326864-ee60
변경 후 타이틀 : 211110 Trigger 길로그
1 행이 갱신되었습니다.
SELECT *
FROM USER_TRIGGERS
ALTER TRIGGER `Trigger 명` [ENABLE|DISABLE]
ALTER TABLE `Table 명` [ENABLE|DISABLE] ALL TRIGGER
ALTER TRIGGER `Trigger 명` COMPILE;
DROP TRIGGER `Trigger 명`