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 옵션이 됨)
[출처] Oracle 11. 트리거(Trigger)|작성자 Zero Point
■ 트리거 형식
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; |
trigger_nameBEFORE 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 를 참조 할 수 없다.
[출처] Oracle 11. 트리거(Trigger)|작성자 Zero Point
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://jentshin.new21.org/cms/study/study438.html
'Database > DB' 카테고리의 다른 글
오라클 LPAD 함수 (0) | 2014.05.09 |
---|---|
[SQL] WHERE 1=1 하는 이유 (0) | 2014.04.07 |
오라클 - 모든 시퀀스 조회 (0) | 2014.03.28 |
Oracle 자동증분 Sequence와 max(seq)+1의 차이 (0) | 2014.03.28 |
oracle to_char 를 이용한 숫자 공백 채우기 99 --> 0099 , FM00000000 의미 (0) | 2014.02.05 |