출처: http://blog.naver.com/whdahek/70179338216
◆데이터베이스 트리거
트리거란 테이블에 어떤 조작이 가해졌을 때에 미리 지정해 놓은 처리를 자동으로 실행시키는 블록을 말하며,
PL/SQL 블록으로 작성한다.
트리거는 테이블, 뷰에 대한 처리 내용, 실행 조건, 실행 시간 등을 설정하고 설정 조건에 따라 자동으로 실행된다.
특히 데이터가 변경되는 중요한 테이블에 트리거를 설정하였는데 문제가 발생할 경우 데이터 추적이 가능하다.
하지만 너무 많이 사용하면 성능이 저하되는 문제점도 발생한다.
트리거는 위의 설정된 이벤트가 발생하면 실행된다.
이벤트가 발생되는 경우는 다음과 같다.
DML 실행, DDL실행 과 데이터베이스 동작 실행 (ex - logon , logoff, startup, shutdown, severerror)
◆ DML 트리거
DML트리거란 INSERT, UPDATE, DELETE문에 의해 테이블의 내용이 변경될 때마다 자동으로 실행되는
PL/SQL 블록을 말한다.
<생성 구문>
CREATE [OR REPLACE] TRIGGER 트리거명 [BEFORE | AFTER] triggering-event ON 테이블명 [FOR EACH ROW] [WHERE 조건] PL/SQL block ; |
before|after = before는 트리거링 이벤트 발생 전에 PL/SQL block을 실행하고 after는 발생 후에 실행한다.
triggering-event = DML의 INSERT, UPDATE, DELETE를 기술한다. 지정된 컬럼(들)에 대해서만 이벤트가 발생하며 지정하지 않을 시 모든 컬럼에 적용된다.
for each row = 선택이며 각 행이 변할 때마다 실행되는 행 수준의 트리거일 때 지정한다.
PL/SQL block = 트리거에서 처리할 블록의 명령문을 기술한다.
위의 특징들에 따라 DML트리거의 유형은 3가지가 있다.
-------------------------------------------
1. 문장 수준과 행 수준의 트리거
2. DML문장
3. 타이밍
------------------------------------
1. 문장 수준과 행 수준의 트리거 =
문장 수준의 트리거는 한 문장의 실행에 의한 변경/삭제가 되는 행의 수와 관계없이 한번만 이벤트가 발생되고 실행된다.
for each row 구문을 포함하지 않는다.
triggering-event 마다 한번만 실행한다.
행 수준의 트리거는 한 문장의 실행에 의한 변경/삭제되는 행의 수만큼 이벤트가 발생되어 실행된다.
for each row 구문을 포함한다.
행이 추가되거나 수정되거나 삭제될 때마다 실행한다.
2.DML문장 =
INSERT는 행이 추가될 때 실행된다.
UPDATE는 변경될 때, DELETE는 삭제될 때 실행된다.
3. 타이밍 =
before는 테이블에 DML 문장이 실행되기 전에 트리거가 실행되고 after는 후에 실행된다.
따라서 테이블에 적용가능한 트리거의 유형은
triggering-event 3종류, for each row 유뮤에 의한 2종류, before과after에 대해 2종류
즉 3 * 2 * 2 종류로 12가지 유형이 된다.
DML트리거에서 컬럼 값을 참조하는 방법에 대해서 보자.
DML트리거의 PL/SQL 블록에서 테이블에 입력,수정,삭제될 때 테이블에 관련된 값을 참조할 수 있다.
이 값은 DML트리거가 실행될 때 :new , :old 두 종류의 의사 레코드(Pseude Record)를 통하여 DML트리거에 나타난다. 형식은 아래와 같다.
:new.컬럼명 :old.컬럼명 |
예를 들어,
INSERT문이 실행되면 추가할 행의 컬럼 값이 :new.컬럼명 으로 나타나고
UPDATE문이 실행되면 수정전 컬럼 값은 :old.컬럼명 으로 나타나고
수정할 컬럼 값은 :new.컬럼명 으로 나타난다.
DELETE문이 실행되면 컬럼 값은 :old.컬럼명 으로 나타난다.
<트리거 작성시 고려사항>
1. DML트리거에서 쩌장된 프로시저나 함수 등을 호출할 수 있다.
2. DML트리거에는 트랜잭션 제어문을 사용할 수 없다.
예외가 발생하거나, 변경된 데이터를 취소할 경우가 발생되었을 때 COMMIT문으로 저장된 값들은
ROLLBACK문으로 취소할 수 없기 때문이다.
예제..
SQL> CREATE OR REPLACE TRIGGER triger_test BEFORE UPDATE ON dept FOR EACH ROW BEGIN DBMS_OUTPUT.PUT_LINE('변경 전 컬럼 값 : ' || : old.dname); DBMS_OUTPUT.PUT_LINE('변경 후 컬럼 값 : ' || : new.dname); END; / -- DBMS_OUTPUT.PUT_LINE을 출력 SQL> SET SERVEROUTPUT ON ; -- UPDATE문을 실행시키면.. SQL> UPDATE dept SET dname = '총무부' WHERE deptno = 30 -- 트리거가 자동 실행되어 결과가 출력된다. 변경 전 컬럼 값 : 인사과 변경 후 컬럼 값 : 총무부 1 행이 갱신되었습니다.
'Oracle' 카테고리의 다른 글
오라클 분석해보기.. A CONNECT BY LEVEL (0) | 2014.12.03 |
---|---|
세로로된 데이터 가로로 출력하기. (0) | 2014.12.02 |
오라클 기본 문접 ㅎㅎ (0) | 2014.12.02 |
RANK DENSE_RANK CUME_DIST PERCENT_RANK NTILE (0) | 2014.12.02 |
SYNONYM 오라클 ORACLE (1) | 2014.12.02 |