* 트리거(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
alter trigger test_trg enable;
insert into test_tbl values(1, 'test1'); |
* 트리거 활성화
[트리거 활성화 구문 형식] alter trigger 트리거명 {enable/disable} |
'개발 관련 지식 > 오라클(Oracle)' 카테고리의 다른 글
[오라클] 테이블 삭제 시 쓰레기통 처리(버전 10g) (0) | 2014.08.08 |
---|---|
[오라클] SQL Loader 사용 방법 (0) | 2014.07.22 |
[오라클] 프로시저(PROCEDURE) (0) | 2014.07.08 |
[오라클] 날짜 1년전, 한달 전, 하루 전 구하는 방법 (0) | 2014.07.08 |
[오라클] 오라클 인덱스 확인 쿼리문 (0) | 2014.07.08 |