본문 바로가기
프로그래밍 공부 정리/database

PL/SQL: trigger

by 메기사랑 2021. 12. 1.

**트리거(trigger) :  SQL에서의 이벤트 처리를 위한 것으로써 
어떠한 테이블에 
이벤트(insert, update, delete)가 일어날 때에
자동으로 동작하는 프로시저를 말합니다.

 


**트리거를 만드는 방법

create or replace trigger 트리거이름
시점 명령어 on 테이블이름 for each row
declare
변수명1 자료형
변수명2 자료형 
begin
트리거가 해야할 명령어(들)
end;


**시점에는 before,after가 올 수 있다
**명령어에는 insert, update, delete가 올 수 있다

 dept테이블에 insert가 된 후에 그 똑같은 레코드를 dept_back 테이블에 자동으로 insert하는 트리거를 만들어보고 
 dept에 insert해봅시다
 
 :new
 ==> insert나 update가 된 새로운 행을 의미하는 키워드이다
 
 
 :old
 ==> delete나, update되기전의 행을 의미하는 키워드이다
 

 create or replace trigger trg_afterInsertDept
 after insert on dept for each row
 declare
 begin
  insert into dept_back values(:new.dno,:new.dname,:new.dloc);
  end;
  /
 
 insert into dept values(50,'개발3팀','제주');


 
 
 dept테이블에 수정이 되면 자동으로 dept_back의 내용도 수정하도록 트리거를 생성하고 dept테이블의 내용을 수정해본다
 

 create or replace trigger trg_afterUpdateDept
 after update on dept for each row
 declare
 begin
  update dept_back set dname= :new.dname, dloc= :new.dloc where dno= :new.dno ;
  end;
  /
 
  update dept set dname='영업3팀', dloc='서교동' where dno=50;
  
   create or replace trigger trg_afterDeleteDept
 after delete on dept for each row
 declare
 begin
  delete dept_back where dno= :old.dno;
 end;
 /
 
 delete dept where dno=50;
 
 
 create table 상품(
 상품번호 number primary key,
 상품명 varchar2(30),
 가격 number,
 재고수량 number
 );
 
 create table 입고(
 입고번호 number primary key,
 상품번호 number references 상품(상품번호),
 입고수량 number,
 입고일 date
 );
 
 insert into 상품 values(100,'색종이',500,0);
 insert into 상품 values(200,'삼각자',700,0);
 insert into 상품 values(300,'딱풀',600,0);
 
 create or replace trigger trg_afterUpdateProduct 
 after insert on 입고 for each row
 declare
 begin
  update 상품 set 재고수량 = 재고수량 + :new.입고수량 where 상품번호= :new.상품번호;
 end;
  / 
 
  insert into 입고 values(1,100,10,sysdate);
  insert into 입고 values(2,200,10,sysdate);
  insert into 입고 values(3,300,50,sysdate);
  insert into 입고 values(4,100,100,sysdate);
 
 create or replace trigger trg_deleteProduct
 after delete on 입고 for each row
 declare
 begin
  update 상품 set 재고수량= 재고수량 - :old.입고수량 where 상품번호= :old.상품번호;
 end;
 /
 
 delete 입고 where 입고번호=1;
 
 
 create or replace trigger trg_updateProduct
 after update on 입고 for each row
 declare
 begin
  update 상품 set 재고수량= 재고수량-(:old.입고수량 - :new.입고수량) where 상품번호= :new.상품번호;
 end;
 /
 
 insert into 입고 values(4, 300, 100, sysdate);


 
 

'프로그래밍 공부 정리 > database' 카테고리의 다른 글

PL/SQL: function  (0) 2021.12.02
PL/SQL: procedure(프로시저)  (0) 2021.11.30
View의 장단점, View와 Table의 차이  (0) 2021.11.29
Index(인덱스)  (0) 2021.11.28
View(뷰), System View(시스템 뷰)  (0) 2021.11.27