오라클 트리거 (Trigger)

트리거 (TRIGGER) 란?

  • 간단히 말해 INSERT,UPDATE, DELETE 문이 Table 에 대하여 수행 되어질 때 묵시적으로 수행되는 Procedure 이다.
  • 트리거는 table 에 저장되는 것이 아니라 별도로 오라클 데이터베이스 자체에 저장 된다.
  • 트리거는 view 에 대해서는 동작하지 않고 table 자체에 대해서만 정의 될 수 있다.

트리거란 특정 테이블의 데이터에 변경이 가해졌을때 묵시적으로 자동으로 수행되는 저장 프로시져라 할 수 있다. C++ 언어 또는
Java 의 Class 의 경우 Constructor 와 Destructor 가 있다. 이들은 Class 가  만들어 질때
자동으로 호출되거나 아니면 소멸되기 전에 자동으로 호출되는 묵시적 수행 함수이다. 바로 이와 같은 기능이 트리거이다.

일반적으로 저장 프로시져 (Stored Procedure)는 사용자가 필요할 때 직접 수행시켜서 해당 프로시져를 수행하였다. 하지만
트리거는 이와 다르게 테이블에 INSERT, UPDATE, DELETE 문에 의하여 변경이 되어질 때 자동으로 수행되므로 이
기능을 이용하여 여러가지 작업을 할 수 있다. 트리거는 이와 같은 특성이 있기 때문에 사용자가 직접 호출 할 수는 없다.

image

INSERTED / DELETED 테이블

트리거를 잘 사용하기 위해서는 INSERTEDDELETED
라는 테이블을 이해 해야 한다. 다시 한번 읽어 보기 바란다. INSERT 와 DELETE 가 아니다. INSERTED 및
DELETED 이다. SQL의 INSERT , DELETE 구문이 아니라는 점을 알기 바란다.  이들은 둘다 테이블 이름이다.

INSERTED 테이블

DELETED 테이블

그럼 이 두가지의 테이블은 과연 무엇일까?? 이 두개의 테이블은 물리적으로 존재하는 테이블이 아니다. 그렇다면, 바로 논리적인 테이블로 그냥 임시 테이블이라 생각하면 좋을듯 하다.

특정 테이블의 데이터가 변경이 가해졌을때 트리거를 위해 자동으로 만들어지는 논리적인 가상의 테이블인 것이다. 그 이름에서 알 수 있듯이 INSERTED 테이블은 테이블에 새로운 데이터가 INSERT 될 때, DELETED 테이블은 테이블의 데이터가 삭제 될때 만들어 진다.

여기서 우리는 한가지 의문을 가진다, UPDATE 에 대한 테이블은 없는가?  하고… 이에 대한 해답은

UPDATE = DELETE + INSERT

이기 때문이다. 즉 변경된다는 것은 기존 값이 제거되고 새로운 값이 추가 되는 것으로 생각할 수 있기 때문이다.

즉 UPDATE 에 의한 테이블 변경은 INSERTED 및 DELETED 테이블이 동시에 존재 한다는 것을 의미 한다.

그러면 이 두개의 가상 테이블에는 어떠한 값이 존재할까?

DELETED 테이블에는 제거 되기 바로 전의 데이터 들이 있게되고 INSERED 테이블에는 변경되는 새로운 내용이 들어가게 된다.

* 이 두가지의 테이블은 말그대로 테이블이다. 그러므로 select * from DELETED ; 와 같이 사용할 수 있다는 것이다.

트리거 만들기

CREATE TRIGGER 문이 트리거를 만들어 주는 명령이다. 또한 DROP TRIGGER 를 이용하여 만들어진 트리거를 제거할 수도 있다. 또한 ALTER TRIGGER를 이용하여 기존의 트리거를 수정 할 수도 있다.

트리거를 만들때는 다음과 같은 내용을 포함하게 된다.

  • 트리거의 이름
  • 어느 테이블에 대한 트리거인지 테이블 이름 지정
  • INSERT,DELETE,UPDATE 중 어느 경우에 수행될 트리거인지 지정 (복수 선택이 가능하다)
  • 실제 수행될 쿼리문 : 이 쿼리문 안에서 INSERTED 및 DELETED 테이블을 이용할 수 있다.

트리거를 이용하여 어떤 작업이든 수행할 수는 없다.  트리거를 통하여 수행할 수 없는 작업들도 있다는 것이다. 수행할 수 없는 작업들은 다음과 같다.

  • 데이터베이스의 변경 : ALTER DATABASE
  • 데이터베이스의 생성 : CREATE DATABASE
  • 데이터베이스의 제거 : DROP DATABASE
  • 데이터베이스의 복구 : RESTORE DATABASE
  • 로그 복구 : RESTORE LOG
  • 기타(DISK INIT, DISK RESIZE, LOAD DATABASE, LOAD LOG, RECONFIGURE)

트리거를 어느때 사용하는가 를 살펴 보자.

  • 데이터베이스 테이블 생성하는 과정에서 참조 무결성과 데이터 무결성 등의 복잡한 제약 조건 생성하는 경우
  • 데이터베이스 테이블의 데이터에 생기는 작업의 감시, 보완
  • 데이터베이스 테이블에 생기는 변화에 따라 필요한 다른 프로그램을 실행하는 경우
  • 불필요한 트랜잭션을 금지하기 위해
  • 컬럼의 값을 자동으로 생성되도록 하는 경우
  • 복잡한 뷰를 생성하는 경우

트리거의 생성 문법 구조

CREATE [ OR REPLACE ] TRIGGER 트리거이름 BEFORE | AFTER | INSTED OF

Triggering_event ON 테이블이름

[ FOR EACH ROW ]

[ WHEN (조건식) ]

PL/SQL 블록;

좀더 정밀한 문법 구조………..

CREATE [OR REPLACE] TRIGGER [schema.]trigger {BEFORE | AFTER} {DELETE | INSERT | UPDATE [OF column [, column] …]} [OR {DELETE | INSERT | UPDATE [OF column [, column] …]}] … ON [schema.]table [ [REFERENCING { OLD [AS] old [NEW [AS] new] | NEW [AS] new [OLD [AS] old] } ] FOR EACH ROW [WHEN (condition)] ] pl/sql_block

트리거 요소들 설명

    CREATE [OR REPLACE] TRIGGER [schema.]trigger

    • 트리거 생성,재생성명령.
  • BEFORE | AFTER

    • 트리거의 시작시점이 트랜잭션의 전인지 후인지를 나타냄.
  • {DELETE | INSERT | UPDATE [OF column [, column] …]}

    • 데이타의 처리유형
  • [OR {DELETE | INSERT | UPDATE [OF column [, column] …]}] …

    • 트리거의 처리유형을 조합하여 선언할때 사용하는
  • ON [schema.]table

    • 트리거가 INVOKE시킬 트랜잭션이 일어나는 테이블
  • FOR EACH ROW : 트리거의 종류,

    • FOR EACH ROW이면 Row-Level Trigger 이문구를 쓰지 않으면 Statement-Level Trigger
  • [WHEN (condition)] ]

    • 데이타의 처리유형이외의 조건을 삽입할 경우에 사용
  • pl/sql_block

    • 실제 트리거의 BODY부분.

트리거를 사용하기 위한 권한들

SYSTEM PRIVILEGE 
변경할 테이블의 OWNER 권한.
alter table 권한.
ALTER ANY TABLE권한
CREATE TRIGGER권한.
CREATE ANY TRIGGER권한.
ALTER ANY TRIGGER 권한.
트리거 트랜잭션을 수행할 수 있는 권한.

이러한 트리거의 유형은 크게 두가지로 나뉜다. : 트리거의 유형

행수준 트리거(Row -Level Triggers) : 트랜잭션내의 각 행에 대해 한 번만 수행             
문수준 트리거(Statement-level Triggers): 트랜잭션내에서 한번만 수행

트리거의 발생 시점

이벤트의 전후에 트리거가 발생   
{BEFORE|AFTER} {INSERT|UPDATE|DELETE} {

row|statement

}
2*3*2 총 12가지의 유형이 나올수 있다.

트리거의 삭제

DROP TRIGGER [schema.]trigger  
트리거가 데이터 딕셔너리에서 영구히 삭제된다.

트리거의 Enable / Disable

기본적으로 트리거를 생성함과 동시에 활성화가 되어 있다.      

ALTER TRIGGER [schema.]trigger
{ ENABLE | DISABLE | COMPILE }
    ENABLE : 트리거를 실행 할 수 있는 상태로 만든다. DISABLE : 트리거를 실행하지 못하는 상태로 만든다. COMPILE : 트리거를 재 컴파일 한다.
특정 테이블의 모든 트리거를 활성화, 비활성화 시킬 수 있다.
ALTER TABLE [schema.]table_name 
[ENABLE|DISABLE] ALL TRIGGERS

흔히 사용하는 트리거 이름 기법 (작명 기법)

트리거의 명칭은 적용될 테이블, 기동하는 DML명령, 
전후(before/after)상태, row-level인지 아닌지 명확하게 표시하는게 좋다.
ledger_def_upd_row
ledger_aft_upd_ins_row 등등.
트리거의 조합에 따라서 INSERTING, UPDATING, DELETING의 세가지로 비교할 수 있다.

INSERTING

 : 트리거링 문장이 INSERT일때 TRUE 그렇지 않으면 FALSE

UPDATING

 : 트리거링 문장이 UPDATE일때 TRUE 그렇지 않으면 FALSE

DELETING

 : 트리거링 문장이 DELETE일때 TRUE 그렇지 않으면 FALSE

image

image

출처 : http://opensourceforge.tistory.com/272

You may also like...

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다