[Oracle] Trigger

GilLog·2021년 11월 10일
1

DataBase

목록 보기
21/25

#import

[ORACLE]오라클_트리거(TRIGGER)[나만의 기록들]


Trigger

TriggerDBMS에서 Data의 입력, 갱신, 삭제 등의 Event가 발생할 때 마다,

자동으로 수행되는 사용자 정의 Procedure이다.


Procedure사용자 정의 함수(UDF)는 사용자가 직접 호출해야만 하지만,

Trigger는 사용자에게 알려주지 않고 자동으로 호출하여 처리한다.

TriggerTable과 별도로 DB에 저장된다.

TriggerView가 아닌 Table에 관해서만 정의할 수 있다.


일반적으로 TriggerSQL 제약 조건 방법을 통해 명시 불가능한 무결성 제약 조건을 구현,

관련 Table Data를 일치시킬 때 주로 사용한다.


제약 조건(Constraint)과 함께 데이터 무결성(Data Integrity)을 유지하는 방법으로,

특정 Event에 대해 자동으로 연속적 동작을 수행하는 형태저장 Procedure라고 볼 수 있다.


Trigger 종류

Trigger문장 트리거, 행 트리거 두 가지 종류로 나눌 수 있다.

Statement Level Trigger

문장 트리거(Statement Level Trigger)Trigger가 설정된 TableTrigger Event가 발생할 경우,

많은 행(Row)에 대해 변경 작업이 발생하더라도,

오직 한번의 Trigger를 발생시키는 종류의 Trigger이다.

Column 값에 변화가 발생할 때마다 실행되는 방식이다.

FOR EACH ROW 옵션을 선언하지 않으면 문장 트리거로 선언된다.

만약 아래와 같은 SQL 문장이 실행되며 여러 행이 변경될 경우 단 한번만 실행된다.

update TB_TEST
set log = log + 1;

Row Level Trigger

행 트리거(Row Level Trigger)는 조건을 만족하는 여러 개의 Row에 대해,

Trigger를 반복적으로 여러번 수행하는 방식이다.

FOR EACH ROW 옵션을 선언하면 행 트리거로 지정 할 수 있다.

FOR EACH ROW WHEN 조건 절로 정의된다.

Column Data 행에 변화올 때 마다 실행되는 방식이다.

변경 후 행을 OLD, NEW를 통해 가져 올 수 있다.


Trigger 제약

Trigger는 트랜잭션 제어문(COMMIT, ROLLBACK, SAVEPOINT)를 사용할 수 없다.

TriggerTriggering 문장의 실행 부분으로, Triggering 문장과 같은 트랜잭션에 존재한다.
Triggering 문장 : Trigger가 걸려 있는 대상 문장

Triggering 문장COMMIT, ROLLBACK 될 때,

Trigger의 작업 또한 COMMIT, ROLLBACK 된다.


Trigger 형식

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와 같은 이름을 가지고 있어도, 무시하고 새로운 것으로 갱신
BEFORETABLE이 변경되기 전 Trigger가 실행
AFTERTABLE이 변경된 후 Trigger가 실행
동작INSERT, UPDATE, DELETE 등 해당 동작이 실행 될 때 Trigger가 실행
NEW새로 추가, 변경 된 후의 값에 Trigger가 적용
INSERT:입력하려는 값, UPDATE:수정 하려는 값
OLD변경 되기 전의 값에 Trigger가 적용
UPDATE:수정 전 값, DELETE:삭제할 값
FOR EACH ROW행 트리거로 설정 한다.
WHENTrigger가 실행 될 때 특정 조건 Data에만 Trigger를 지정하는 조건 값
Trigger Body트리거 본문 코드 입력 부분
BEGIN으로 시작, END로 끝날 때 하나 이상의 SQL문이 존재해야 한다.
변수에 값을 치환할 때 예약어 SET 사용

Trigger 예제

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 행이 갱신되었습니다.

Trigger 관리

Trigger 조회

SELECT *
FROM USER_TRIGGERS

활성화 / 비활성화

ALTER TRIGGER `Trigger` [ENABLE|DISABLE]

테이블에 속한 Trigger 활성화 / 비활성화

ALTER TABLE `Table` [ENABLE|DISABLE] ALL TRIGGER

Trigger 수정 후 재 컴파일

ALTER TRIGGER `Trigger` COMPILE;

Trigger 삭제

DROP TRIGGER `Trigger`
profile
🚀 기록보단 길록을 20.10 ~ 22.02 ⭐ Move To : https://gil-log.github.io/

0개의 댓글