Oracle/PL_SQL2009. 11. 17. 18:50

trigger(이하 트리거)를 한국어로 번역하면 방아쇠다.
특정 이벤트가 발생하면 자동으로 돌아가는 블럭이라고 한다.

쓰는 형식은 다음과 같다.

create or replace trigger 트리거명
before insert or update of 컬럼명 on 테이블명
for each row
begin
    :new.ename := upper(:new.ename);
end;
/

before         이벤트가 일어나기 전에 실행
after            이벤트가 일어난 후에

for each row ->row trigger(행트리거)
                      없으면 statement trigger(문장 트리거)


그럼 trigger(이하 트리거)를 만들어 보자

트리거를 생성하고, 실습하기 위해 t1테이블을 생성해보자

drop table t1 purge;
create table t1
    (empno number primary key, 
     ename varchar2(10));

트리거를 생성하자. 아래의 트리거는 이름은 t1_ename_tri이고
t1테이블의 ename컬럼에 insert나 update가 row단위로 되면 실행되는 트리거이다.

create or replace trigger t1_ename_tri
before insert or update of ename on t1
for each row
begin
    :new.ename := upper(:new.ename);
end;
/


t1테이블에 데이터를 입력해본다.

insert into t1 values (1, 'aaa');
insert into t1 values (2, 'bbb');
commit;

들어간 데이터를 확인한다.

select *
from t1;

EMPNO ENAME
1 AAA
2 BBB


만약 t1테이블에 ename의 컬럼을 전부 대문자가 아닌, 첫 글자만 대문자로 입력하고 싶을 경우
아래와 같이 트리거를 수정한다.

create or replace trigger t1_ename_tri
before insert or update of ename on t1
for each row
begin
    :new.ename := initcap(:new.ename);
end;
/

데이터를 입력한다.

insert into t1 values (3, 'GGG');
commit;

트리거에 의해 데이터가 제대로 입력되었는지 확인한다.

select *
from t1;


EMPNO ENAME
1 AAA
2 BBB
3 Ggg


트리거 내부에서 에러가 나면 트리거를 유발한 작업이 실패한다.
절대로 안바뀌는 것은 프로그램단에 바뀔 여지가 있는 것은 서버단에 구현.
너무 트리거를 많이 만들지 말 것. 하나의 트리거가 수정되는 경우 연관된 트리거를 찾기가 쉽지 않다.


관련 예제) http://blog.naver.com/orapybubu?Redirect=Log&logNo=40025296984

'Oracle > PL_SQL' 카테고리의 다른 글

instead of trigger  (0) 2009.11.18
print_table프로시져 만들기  (0) 2009.11.18
package의 overloading  (0) 2009.11.17
테이블 변경시 관련 procedure, function, package 확인  (0) 2009.11.16
wrap pld  (0) 2009.11.16
Posted by 자수성가한 부자