DataBase/oracle

oracle PL/SQL_트리거

HUCHUCHU 2020. 4. 26. 16:27

 

트리거 :

데이터베이스가 미리 정해 놓은 조건을 만족하거나, 특정 이벤트가 발생하면 자동적으로 수행되는 동작 

개발자가 호출하여 사용할 수 없다.(오라클에서 자동적으로 실행되는 PL/SQL 블록을 의미)

 

<트리거의 유형>

가장 많이 사용되는 트리거의 유형 : insert, update, delete의 결과로 실행되는 DML트리거

 

   ***구문형식

create [or replace] trigger 트리거이름

timming[before | after] event [insert | update | delete ] on 테이블명

begin

   실행명령;

end;

 

1-1) 테이블을 생성 후 테이블에 insert가 될 때마다 msg를 출력하는 트리거를 만든다

1
2
3
4
5
6
7
8
9
10
11
12
create table sample_dept (
    dept_id number,
    dept_name varchar2(15),
    loc varchar2(10)
);
 
create or replace trigger print_msg
after insert on sample_dept
begin
    dbms_output.put_line('부서가 추가되었습니다');
end;
/
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

 

1-2) insert를 실행하면  트리거의 문구가 출력된다

1
insert into sample_dept values (10'마케팅부''서울');

 

2-1) 테이블 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
create table item (
    code char(6primary key--물품코드
    name varchar2(15not null--물품이름
    company varchar2(15not null--물품회사
    price number(8), --물품가격
    cnt number default 0 --수량
);
 
create table warehouse (
    num number(6primary key--입고번호
    code char(6references item(code),
    indate date default sysdate, --입고날짜
    incnt number(6), --입고수량
    inprice number(6), --단가
    totalprice number(8--총수량 
);
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

 

warehouse에 입고수량을 변경하면 item테이블에도 반영되는 trigger 작성

 

2-2) warehouse에 우선 데이터를 insert해준다

1
2
insert into item(code, name, company, price) values ('c001''에어컨''삼성'1000000);
insert into item(code, name, company, price) values ('c002''선풍기''엘지'50000);

 

2-3) warehouse에 insert가 발생하면 실행되는 trigger

      -- new 선언은 insert, update에서만 사용된다

      -- 바인드 변수를 사용하여 적용할 수 있다

1
2
3
4
5
6
7
8
create or replace trigger cnt_add
after insert on warehouse
    for each row
begin
        update item set cnt = cnt + :new.incnt
        where code =:new.code;
end;
/
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

 

2-4) warehouse에 delte가 발생하면 실행되는 trigger

      -- old 선언은 delete에서 사용한다

1
2
3
4
5
6
7
8
create or replace trigger cnt_sub
after delete on warehouse
for each row
begin
    update item set cnt = cnt - :old.incnt
    where code = :old.code;
end;
/
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

 

2-5) wherehouse에 update가 발생하면 실행되는 trigger

      -- 기존의 있던 값을 지우고 update해주어야하기때문에 -로 기존값을 지우고 +로 새로운값을 주입한다...?!

1
2
3
4
5
6
7
8
create or replace trigger cnt_update
after update on warehouse
for each row
begin
    update item set cnt = cnt +- :old.incnt +:new.incnt
    where code = :new.code;
end;
/
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter