본문 바로가기

개발 관련 지식/오라클(Oracle)

[오라클] 트리거(TRIGGER)

* 트리거(TRIGGER)

: 임의의 Table 에 대해 Insert/Update/Delete 등의 SQL이 실행되면 암시적으로 실행되는 프로시저

- Trigger 는 관련된 Table과는 별개로 DB 내에 저장된다.

- Trigger 는 뷰가 아닌 Table 에 대해서만 정의가 가능하다. 그러나 View 의 기본 Table 에 있는 Trigger는 View 에 대해 Insert/Update/Delete 가 발생하게 되면 동작한다.

 

 [참고] INSERTED / DELETED 테이블

트리거를 잘 사용하기 위해서는 INSERTED 와 DELETED 라는 테이블을 이해해야 한다. SQL의 INSERT, DLEETE 구문이 아니라는 점을 알아야 한다. 이들은 둘다 테이블 이름이다.

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

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

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

UPDATE = DELETE + INSERT

이기 때문이다. 즉 변경된다는 것은 기존 값이 제거되고 새로운 값이 추가되는 것으로 생각할 수 있기 때문이다. 즉, UPDATE 에 의한 테이블 변경은 INSERTED 및 DELETED 테이블이 동시에 존재한다는 것을 의미한다.

 

 

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

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

 

 

* 트리거 생성

 

 [트리거 생성 구문 형식]

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 [schma.]table : 트리거가 INVODE 시킬 트랜잭션이 일어는 테이블

- FOR EACH ROW : 트리거의 종류

FOR EACH ROW 면 Row-Level Trigger

이 문구를 쓰지 않으면 Statement-Level Trigger

- [WHEN (condition)]]​ : 데이터의 처리유형 이외의 조건을 삽입할 경우에 사용

- pl/sql_block : 실제 트리거의 BODY 부분

 

 

* 트리거 삭제

 

 [트리거 삭제 구문 형식]

DROP TRIGGER 트리거이름;

 

 

 [트리거 기본 예제]

CREATE OR REPLACE TRIGGER test_trg
AFTER DELETE OR INSERT OR UPDATE ON test_tbl
FOR EACH ROW
WHEN (new.t_num > 0)
BEGIN
insert into test_tbl_tmp values(:new.t_num, :new.t_name);
END;
/

 

alter trigger test_trg enable;

 

insert into test_tbl values(1, 'test1');
insert into test_tbl values(2, 'test2');

 

 

* 트리거 활성화

 

 [트리거 활성화 구문 형식]

alter trigger 트리거명 {enable/disable}