고래씌

[Oralce] 17. Object(TRIGGER) - 트리거 본문

Database/Oracle

[Oralce] 17. Object(TRIGGER) - 트리거

고래씌 2023. 12. 1. 15:09

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
TB_PRODUCT

 

 

☞ 상품이 입고되면 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