본문 바로가기
Database/DB

oracle Trigger(오라클 트리거) 정의

by 댓츠굿 2014. 4. 10.

oracle trigger


■ 개요

테이블에 대한 이벤트를 자동으로 실행 해 주는 것이다. 즉, 자동으로 실행되는 PL/SQL 문이라고 보면 된다.

예를 들면 A,B,C 라는 테이블에 공통으로 사원번호가 있다 .  A테이블의 사원번호가 지워지면 B,C테이블의 회원번호도 자동으로 지워지게하거나 Update , insert 등을 할 수 있다.


Insert, Update, Delete이 실행되는 시점 전에 또는 후에 동반되어야 하는 작업을 정의한다.

즉, DML(데이터조작언어) 데이터 상태의 관리를 자동화 하는 것이다.


--자료의 무결성을 유지

--변경된 자료 및 변경한 유저를 기록해서 테이블의 변경정보 감시

--지정한 이벤트가(DML)가 발생할때마다 자동으로 실행되는 PL/PQL 블럭

--자동 호출(호출문 없음)


■ 주의

  트리거 내에서는 COMMIT, ROLLBACK 문을 사용할 수 없다.


■ TRIGGER의 종류

  트리거는 SQL문이 언제 실행되느냐에 따라 또는 트리거하는 SQL 문장에 의해 영향 받는 각 row에 대해 트리거가 실행되느냐 아니냐에 따라 다음과 같이 분류된다.

 

SQL문의 실행시기에 따른 분류

BEFORE 트리거

SQL 문장이 실행되기 전 트리거가 먼저 실행됨

AFTER 트리거

SQL 문장이 실행된 다음 트리거가 실행됨

SQL문에 의해 영향 받는 각 row에 따른 분류

ROW 트리거

SQL 문장의 각 row에 대해 한번 씩 실행

STATEMENT 트리거

SQL 문장에 대해 한번만 실행

(DEFAULT TRIGGER)


  실행 시점과 범위를 조합하여 트리거는 다음 4가지로 분류한다.

 

실행시점

실행범위

내용

BEFORE

STATEMENT

SQL 문이 실행되기 전에 그 문장에 대해 한번 실행

BEFORE

ROW

DML 작업하기 전에 각 ROW에 대해 한 번씩 실행

AFTER

STATEMENT

SQL 문이 실행된 후 그 문장에 대해 한번 실행

AFTER

ROW

DML 작업한 후 각 ROW에 대해 한 번씩 실행

 

 ⋅문장 트리거

   트리거가 설정된 테이블에 트리거 이벤트가 발생하면 많은 행에 대해 변경 작업이 발생하더라도 오진 한번만 트리거를 발생시키는 방법

  Insert, Update, Delete 한 번만 실행 된다. 컬럼값이 변화가 생길 때마다 스스로 알아서 실행 된다.

  (FOR EACH ROW 옵션이 사용되지 않음)

  예를 들어 "UPDETE emp SET 급여 = 급여 * 1.1;" 문장이 실행되면 여러 행에 대하여 자료가 변경 되더라도 한번만 트리거가 실행된다.


 ⋅행 트리거

   조건을 만족하는 여러 개의 행에 대해 트리거를 반복적으로 여러 번 수행하는 방법으로 [FOR EACH ROW WHEN 조건]절 정의된다.

  컬럼의 데이터 행이 변화가 오면 실행된다. 변경 후의 행은 OLD, NEW 사용하여 가저올 수 있다. 

  (FOR EACH ROW 옵션이 됨)


■ 트리거 형식

 

CREATE or REPLACE TRIGGER trigger_name

BEFORE or AFTER 

[INSERT,DELETE,UPDATE] ON table_name

[Referencing OLD AS {변경전 값을 참조하는 변수명} NEW AS {변경후 값을 참조하는 변수명}]

[ FOR EACH ROW ]

DECLARE

-- 변수선언

BEGIN

-- 트리거드(PL/SQL 코드)

EXCEPTION

WHEN

--익셉션

END;



CREATE OR REPLACE TRIGGER trigger_name
BEFORE UPDATE
ON table_name
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE
BEGIN
    
INSERT INTO TABLE_MOD
(aa,bb,cc)
   VALUES
(:OLD.aa,:OLD.bb,:OLD.cc);


* column 단위의 변화 형식


CREATE [OR REPLACE] TRIGGER trigger_name  

             BEFORE (OR AFTER)

             UPDATE [ OF column1, column2 …] ON table_name

             [FOR EACH ROW]

DECLARE

             변수 선언부;

BEGIN

             프로그램 코딩부;

END;

/ 



row 단위의 변화 형식


CREATE [OR REPLACE] TRIGGER trigger_name 

             BEFORE (OR AFTER)

             UPDATE (OR DELETE OR INSERT) ON table_name

             [FOR EACH ROW]

DECLARE

             변수 선언부;

BEGIN

             프로그램 코딩부;

END;

/




■ 이벤트

  INSERT, UPDATE, DELETE

 ⋅BEFORE : 구문을 실행하기 전에 트리거를 시작

 ⋅AFTER : 구문을 실행한 후에 트리거를 시작

 ⋅FOR EACH ROW : 행 트리거임을 알림

 ⋅WHEN 조건 : 사용자의 트리거 이벤트 중에 조건에 만족하는 데이터만 트리거 한다.

 ⋅REFERENCING : 영향 받는 행의 값을 참조

 ⋅:OLD : 참조 전 열의 값(INSERT : 입력 전 자료, UPDATE : 수정 전 자료, DELETE : 삭제할 자료)

 ⋅:NEW : 참조 후 열의 값(INSERT : 입력할 자료, UPDATE : 수정할 자료)

 

  ROW 트리거에서 컬럼의 실제 데이터 값을 제어하는데 사용하는 연산자는 :OLD와 :NEW이다. 이 연산자와 함께 컬럼 명을 함께 기술한다. 예를 들어, 컬럼명이 sal이라고 하면, 변경전의 값은 :OLD.sal이고 변경 후의 값은 :NEW.sal 처럼 표기한다.

 

  또한 문장 트리거에서는 :NEW, :OLD 를 참조 할 수 없다.


BEFORE : 데이터 처리가 실행되기 전

AFTER : 데이터 처리가 실행 된 후

FOR EACH ROW : 데이터 처리시 건건이 모두 트리거 실행

:OLD.컬럼명 : SQL 반영전의 컬럼 데이터

:NEW.컬럼명: SQL 반영 후의 컬럼 데이터

RAISE_APPLICATION_ERROR( 에러번호, 에러내용 ) : 강제 에러 처리 (에러번호는 -20000 ~ -20999까지 임의로 사용할 수 있다.)


참조: http://blog.naver.com/PostView.nhn?blogId=finekiller&logNo=70130220441

http://lejewk.tistory.com/374

http://jentshin.new21.org/cms/study/study438.html



반응형