article thumbnail image
Published 2020. 8. 27. 21:34

 

Trigger

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

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

 


 

[ 가장 많이 사용되는 트리거 유형 ]

Insert, Update, Delete의 결과로 실행되는 DML Trigger

 

 

[ 구문 형식 ]

create [or replace] [ Trigger Name ]
timming [ before | after ] event [ insert | update | delete ]
on [ Table Name ]

begin
	실행 명령;
end;

 

 

  • 예제 1 - 부서가 추가되면 자동으로 출력되는 Trigger
-- 샘플 테이블 생성
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;
/

 

  • 트리거 생성 확인

 

  • 트리거 수행 확인
INSERT INTO SAMPLE_DEPT values(10, '마케팅부', 'Seoul');

 

 

  • 예제 2 - 창고에 물품이 입고되면, 입고 수량만큼 재고 수량 갱신

 

-- 테이블 생성

CREATE TABLE item(
	code char(6) PRIMARY KEY, -- 상품 코드 
	name varchar2(15) NOT NULL,
	company varchar2(15),
	price number(8),
	cnt NUMBER DEFAULT 0 -- 재고 수량
);

CREATE TABLE warehouse(
	num number(6) PRIMARY KEY, -- 입고 번호
	code char(6) references item(code),
	indate DATE DEFAULT sysdate, -- 입고 날짜 
	incnt number(6),
	inprice number(6), -- 단가 
	totalprice number(8)
);

 

 

  • Item INS

 

INSERT INTO ITEM(code, name, company, price)
values('c0001', '에어컨', 'apple', '1000000');

INSERT INTO ITEM(code, name, company, price)
values('c0002', '선풍기', 'lg', '50000');


SELECT * FROM ITEM i;

 

 

 

 

 

 

  • 창고에 Ins 되면 재고 Upd Trigger 

 

SELECT * FROM ITEM i;


CREATE OR REPLACE TRIGGER cnt_add
AFTER INSERT ON warehouse
FOR EACH ROW 
	BEGIN
		UPDATE ITEM SET cnt = cnt + :NEW.incnt -- new 선언은 insert문, update문에서만 사용 가능 
		WHERE code = :NEW.code;
	END;
	
INSERT INTO warehouse(num, code, incnt, inprice, totalprice)
VALUES (1, 'c0001', 10, 500, 5000);

 

 

  • 창고 Del 재고 Del Trigger

 


-- 트리거 생성
CREATE OR REPLACE TRIGGER cnt_sub
AFTER DELETE ON warehouse
FOR EACH ROW -- 각각 row에 실행 
	BEGIN
		UPDATE ITEM SET cnt = cnt - :OLD.incnt 
      	  -- ins에서는 OLD 사용 불가
		WHERE code = :OLD.code;
	END;/
	

DELETE FROM warehouse WHERE code = 'c0001';

 

 

  • Upd Trigger

 

CREATE OR REPLACE TRIGGER cnt_update
AFTER UPDATE ON warehouse
FOR EACH ROW
BEGIN
	UPDATE ITEM SET cnt = cnt+- :OLD.incnt + :NEW.incnt;
    	-- :OLD 기존에 있던 값을 빼고 :NEW 새로운 값을 더하겠다.
	-- => 업데이트하겠다는 의미  
	WHERE code := NEW.code;
END;

 

  • 창고에 Insert
INSERT INTO WAREHOUSE(NUM, CODE, INCNT, INPRICE, TOTALPRICE)
VALUES (1, 'c0001', 10, 900000, 9000000);

 

 

  • Update
UPDATE warehouse SET incnt = 7, inprice = 10000 WHERE code = 'c0001';

 

 

 

복사했습니다!