고래씌
[Oralce] 17. Object(TRIGGER) - 트리거 본문
1. 트리거(Trigger)
: 내가 트리거로 지정한 테이블에 INSERT, UPDATE, DELETE 등의 DML문에 의해 변경사항이 발생할 경우 "자동으로" 매번 실행할 내용을 정의해둘 수 있는 객체
EX)
- 회원탈퇴시 기존의 회원테이블에 데이터를 DELETE한 후 곧바로 탈퇴된 회원들만 따로 보관하는 테이블에 자동으로 INSERT 시킬때
- 신고횟수가 일정수를 넘었을 때 회원을 블랙리스트 처리하고자 할때
- 입출고에 대한 데이터가 기록될때마다 해당 상품에 대한 재고수량을 매번 수정해줘야할 때 등등...
▶ 트리거의 종류
- SQL문의 시행시기에 따른 분류
☞ BEFORE TRIGGER : 내가 지정한 테이블에 DML(INSERT, UPDATE, DELETE)가 발생되기 전에 트리거 먼저 실행
☞ AFTER TRIGGER : 내가 지정한 테이블에 DML이 발생된 후 트리거 실행
- SQL문에 영향을 받는 각 행에 따른 분류
☞ STATEMENT TRIGGER(문장트리거) : DML이 발생한 SQL문에 딱 한번만 트리거를 실행
☞ ROW TRIGGER(행트리거) : 해당 SQL문 실행할 때마다 매번 트리거 실행
ⓐ :OLD - BEFORE UPDATE, BEFORE DELETE에서 사용
ⓑ :NEW - AFTER INSERT, AFTER UPDATE에서 사용
▶ 트리거 장점
1. 데이터 추가, 수정, 삭제시 자동으로 데이터를 관리해줌으로써 무결성 보장
2. 데이터베이스 관리의 자동화
▶ 트리거 단점
1. 빈번한 추가, 수정, 삭제시 ROW의 삽입, 추가 함께 실행되므로 성능상 좋지 못하다.
2. 관리적 측면에서 형상관리가 불가능하다.
3. 트리거를 남용하게 되는 경우 예상하지 못하는 상황이 발생할 수 있으며, 처리하기 힘들다.
▶ 트리거 생성구문
[표현식]
CREATE OR REPLACE TRIGGER 트리거명 BEFORE|AFTER INSERT|DELETE|UPDATE ON 테이블명 [FOR EACH ROW] -- 행마다 BEGIN 실행내용(위 지정한 이벤트 발생시 자동으로 실행할 구문) END; |
▶ EMPLOYEE 테이블에 새로운 행이 추가될 때마다 자동으로 메세지를 출력해주는 트리거 정의
☞ AFTER INSERT를 이용하였기 때문에 먼저 INSERT 구문이 실행이 되고, 다음 트리거가 실행되어 '신입사원님 환영합니다'가 출력되는 것을 확인할 수 있다.
1) 상품 입출고 관련예시 ① (트리거 생성하지 않고 사용할 경우)
①필요한 테이블 및 시퀀스 생성
- 상품에 대한 데이터를 보관할 테이블(TB_PRODUCT)
- 상품번호용 시퀀스
- 샘플데이터 추가
② 상품 입출고 상세 이력 테이블(TB_PRODETAIL)
- 어떤 상품이 어떤 날짜에 몇개가 입고 또는 출고가 되었는지에 대한 데이터를 기록
- 이력번호용 시퀀스
- 200번 상품이 오늘날짜로 10개 입고
- 200번 상품의 재고수량 10 증가
☞ 상품이 입고되면 TB_PRODUCT 테이블에 일일이 UPDATE 문을 이용해서 쳐주어야 한다는 번거로움이 발생한다!
2) 상품 입출고 관련예시 ② (트리거 사용할 경우)
- TB_PRODETAIL 테이블에 상품이 INSERT 되면 TB_PRODUCT테이블에 매번 자동으로 재고수량이 UPDATE 되게끔 트리거를 정의
=> 상품이 입고된 경우 → 입고된 상품을 찾아서 재고수량 증가(UPDATE)
=> 상품이 출고된 경우 → 출고된 상품을 찾아서 재고수량 감소(UPDATE)
① 위 상품 입출고 관련예시① 에서 사용하였던 TABLE 그대로 이용.(TB_PRODUCT, TB_PRODUCT)
② 트리거 생성
☞ 상품이 입고되었다면 TB_PRODUCT 테이블에 자동으로 수량 증가, 출고되었다면 수량 감소하는 트리거 작성
☞ BEFAR INSERT 였다면 실행되기 이전에 값이 담기게 될 것임
- 200번 상품이 오늘날짜로 20개 입고
☞ SELECT * FROM TB_PRODUCT; 을 이용하여 조회한 결과, UPDATE문을 이용하여 TB_PRODUCT 테이블에 추가를 안하여도 자동으로 결과가 반영된 것을 확인할 수 있다!!
'Database > Oracle' 카테고리의 다른 글
[Oralce] 16. Object(FUNCTION) - FUNCTION (0) | 2023.12.01 |
---|---|
[Oralce] 15. Object(Procedure) - 프로시저 (0) | 2023.12.01 |
[Oracle] 14. PL/SQL (0) | 2023.12.01 |
[Oracle] 13. Object(INDEX) - INDEX (0) | 2023.12.01 |
[Oracle] 12. Object(SEQUENCE) - 시퀀스 (0) | 2023.11.30 |