Day45 - Trigger 트리거

2021. 4. 19. 19:00Oracle 공부

이번에는 트리거 에 대해서 알아 봅시다.

 

트리거

트리거는, 테이블에 부착(연결)해서 사용하는 형태로, INSERT UPDATE DELETE 작업이 수행될 때 특정 코드가 동작하도록 하는 구문 입니다.

 

예를 들어서, 쇼핑 앱(쇼핑몰) 을 생각해 봅시다.

제가 PC를 1개 샀습니다. 그러면, 판매글에서 남은 수량이 1개 줄어 들겠죠?

 

이 일련의 과정을 코드로 짯다고 생각해 봅시다.

그러면, 제가 PC를 1개 사는 코드 / 판매글의 남은 수량이 1개 줄어드는 코드

각각 작성하고 실행시켜 주어야 겠죠?

 

그런데, 쇼핑 앱(쇼핑몰) 에서 물건을 사는 행위가 저 혼자만 있나요? 아니죠?

굉장히 많이 일어납니다. 그럼 그 때마다 이 코드를 각각 실행 시켜줄 건가요? 물론 그래도 됩니다.

그런데, 효율적으로 생각을 해봅시다.

 

물건을 1개 사면, 자동적으로 판매글의 남은 수량이 1개 줄어드는 것.

이 역할을 해줄 수 있는 애가 바로 "트리거" 입니다 !

 

트리거의 종류

트리거에는 3가지의 형태가 있습니다.

 

1. AFTER -> DML(INSERT, UPDATE, DELETE)문 직후에 동작하는 트리거

2. BEFORE -> DML(INSERT, UPDATE, DELETE)문 이전에 동작하는 트리거

3. INSTEAD OF -> 뷰에 부착하는 트리거

 

 

트리거의 형태

CREATE OR REPLACE TRIGGER 트리거명
    트리거타입(종류)
    ON 부착시킬 테이블
    OPTION(FOR EACH ROW)

/* DECLARE ( 생략 가능 ) */
BEGIN

END;

 

이제 트리거를 직접 만들어 봅시다.

먼저, 트리거를 사용하기 위한, 간단한 테이블을 만들어 줍시다.

※ 눈에 덜 부담되고, 잘 보이라고 테마를 검은색으로 변경했습니다.

트리거타입(종류) 에는, AFTER, BEFORE, INSTEAD OF 중 1개를 써주면 되며, 그 뒤에 어떤 DML문을 실행했을 때 실행되게 할 것인지 적어 주면 됩니다.

부착 테이블, 즉 연결할 테이블을 적어주세요.

OPTION 은 FOR EACH ROW 를 써주면 됩니다. ( 컬럼의 모든 행에 적용한다 )

 

DECLARE 에는 변수의 선언 및 초기화를 할 수 있으며, 생략 가능합니다.

 

BEGIN 에는 실행문을 적어주면 됩니다.

 

END; -> 끝

 

즉. TBL_TEST에 DELETE 또는 UPDATE 가 될 때마다 트리거가 자동적으로 실행된다는 얘기 입니다.

※ 주석을 참조해주세요.

 

트리거 변수참조 키워드

트리거는 INSERT, UPDATE, DELETE 실행과 연관이 있습니다.

 

그래서, 백업 테이블에 많이 사용하는데요. 먼저 키워드를 알아 봅시다.

 

:OLD - 참조전 COLUMN값 (INSERT: 입력전 자료, UPDATE: 수정전 자료, DELETE:삭제전 자료)
:NEW - 참조후 COLUMN값 (INSERT: 입력후 자료, UPDATE: 수정후 자료)

 

UPDATE OR DELETE를 시도하면 기존자료를 백업테이블에 보관
AFTER 트리거는 보통 UPDATE, DELETE 사용 ( :OLD, :NEW )
BEFORE 트리거는 보통 INSERT 사용 ( :NEW )

 

※ 예제를 한번 봅시다.

 

이번에는, 테이블을 2개 만들어 줍시다.

TBL_USER 는 원본 테이블. TBL_USER_BACKUP 은 백업 테이블.

USER() -> 현재 계정사용자 (HR)

 

TBL_USER 테이블에 UPDATE 또는 DELETE 가 실행되면, 해당 트리거가 자동 실행됩니다.

 

실행되는 코드는, BEGIN ~ END 구문.

 

UPDATING , DELETING 은 시스템에서 지원하는 구문으로. 말 그대로 UPDATE되었을 때, DELETE되었을 때 입니다.

해당 구문을 전부 실행한 후, TBL_USER_BACKUP 테이블을 확인해보면 !?

요렇게, UPDATE 하기 전의 데이터와, DELETE 하기 전의 데이터가 INSERT 된 것을 확인 할 수 있습니다.

 

여태까지 다 AFTER 트리거 였는데,

이제 BEFORE 트리거에 대해 알아 봅시다.

 

BEFORE 트리거

BEFORE 트리거는, INSERT, UPDATE, DELETE 문이 실행될 때, 되기 전에 먼저 트리거를 실행합니다.

 

TBL_USER에 값을 추가할 때, 추가되기 전, 첫글자만 가져와서 ***를 붙이고 추가하는 트리거 입니다.

:OLD 는 쓸 수 없는데, 그 이유는, INSERT되기 전에 값은 없기 때문입니다.

트리거를 작동시켜 줍시다.

이렇게, BEFORE 트리거는 항상 해당하는 DML문이 실행되기 전에 먼저 작동합니다.

 

트리거 응용하기

주문을 기록하는 테이블을 만들어 봅시다. ( 주문 테이블 생략 )

주문 기록 테이블, 상품 테이블.

요렇게 만들어 주세요.

 

이제, 상품을 주문하면, 해당 주문이 주문기록 테이블에 들어오고, 상품에 P_TOTAL 을 감소시켜줄 트리거를 만들겁니다.

즉. 주문기록 테이블에 INSERT 된 후. 수량을 - 해줍니다.

PRODUCT 테이블을 확인해보면, P_TOTAL 이 감소된 것을 확인 할 수 있습니다.

오늘은 이렇게, 트리거에 대해서 알아 보았는데요. 트리거를 몰라도 해당하는 작업을 못하는 건 아닙니다. 하지만 알면 좋다는거 ~

 

고생하셨습니다.

 

오늘은 여태까지 배운 PL/SQL 을 시험보고 내일부터 새로운 걸 나간다고 합니다.

 

☆ P.S : 안배운 것도 있는데, 학원에서는 여기까지만 배운다고 합니다. (여기까지만 알아도 충분하대요)