본문 바로가기
Kosta DevOps 과정 280기/Java

trigger

by 롯슈83 2024. 6. 24.
  • 어떠한 테이블에 insert, update, delete이 일어났을 떄 연쇄하여 자동으로 동작시키고자 할 sql 문장이 있다면 트리거용한다. 
  • 이벤트 발생( insert, update, delete)시 자동으로 연쇄.
  • 대상이 되는 테이블, 이벤트 종류, 시점을 정할 수 있다. 
create or replace trigger 트리거이름
시점 이벤트 종류
on 테이블명 for each row

declare

begin

end;
/
  • 시점에는 before, after가 올 수 있다.
  • 이벤트에는 insert, update, delete 가 올 수 있다.
  • 트리에서 사용할 수 있는 키워드
    • :new - insert, update 가 된 새로운 행을 의미하는 변수
    • :old - delete, update 되기 전 과정의 행을 의미하는 변수

-- dept에서 변경이 되면 dept_back에서도 변경이 일어나게 
create table dept_back as select * from dept;
desc dept_back;

create or replace trigger trg_dept
after insert
on dept for each row
declare
begin
	insert into dept_back values(:new.dno, :new.dname, :new.dloc);
end;
/

create or replace trigger trg_update_dept
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 dloc ='제주' where dname like '%개발%';
select * from dept;
rollback;

create or replace trigger trg_delete_dept
after delete
on dept for each row
declare
begin
    delete dept_back where dno = :old.dno;
end;
/


insert into dept values(100, '테스트팀', '제주');
select * from dept_back;
delete dept where dno = 100;
select * from dept_back;
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);

commit;

select * from 상품;
desc 입고;

-- 입고 상품 번호가 입고가 되면 재고 수량을 수정하는 것.
--입고되는 만큼 증가됨.

create or replace trigger trg_insome
after insert
on 입고 for each row
declare
begin
    update 상품 set 재고수량 = 재고수량 + :new.입고수량 where 상품.상품번호 = :new.상품번호;
end;
/
update 상품 set 재고수량 = 0;
delete 입고;

insert into 입고 values(1, 100, 5, sysdate);
select * from 입고;
select * from 상품;
insert into 입고 values(2,200, 10, sysdate);
select * from 입고;
select * from 상품;
insert into 입고 values(3, 100, 7, sysdate);

-- 입고 내역 삭제되는 만큼 재고도 감소
create or replace trigger trg_return
after delete
on 입고 for each row
declare
begin
    update 상품 set 재고수량 = 재고수량 - :old.입고수량 where 상품.상품번호 = :old.상품번호;
end;
/

delete 입고 where 입고번호 = 3;

select * from 상품;
select * from 입고;

-- 입고 수정한 수량만큼 상품 수량도 변경
create or replace trigger trg_update_입고
after update
on 입고 for each row
declare
begin
    update 상품 set 재고수량 = 재고수량 + (:new.입고수량 - :old.입고수량) where 상품번호 = :new.상품번호;
end;
/
show error;

select * from 입고;
update 입고 set 입고수량 = 5 where 입고번호 = 4;
select * from 입고;
select * from 상품;
update 입고 set 입고수량 = 5 where 입고번호 = 4;
select * from 입고;
select * from 상품;
update 입고 set 입고수량 = 40 where 입고번호 = 4;

 

'Kosta DevOps 과정 280기 > Java' 카테고리의 다른 글

웹 공부 사전 준비  (0) 2024.07.03
사용자 정의 함수(function)만드는 방법  (0) 2024.06.25
PL/SQL  (0) 2024.06.24
index  (0) 2024.06.24
뷰(View)  (0) 2024.06.24