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';
'SQL' 카테고리의 다른 글
[Oracle] Index의 종류 (0) | 2020.09.21 |
---|---|
[Oracle] Index 인덱스의 이해 1 (0) | 2020.08.27 |
[Oracle] PL/SQL Package 패키지의 이해 (0) | 2020.08.07 |
[Oracle] PL/SQL 함수 Function (0) | 2020.07.26 |
[Oracle] PL/SQL 서브 프로그램의 이해, 프로시저 (0) | 2020.07.26 |