2021. 4. 19. 19:00ㆍOracle 공부
이번에는 트리거 에 대해서 알아 봅시다.
트리거
트리거는, 테이블에 부착(연결)해서 사용하는 형태로, 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 : 안배운 것도 있는데, 학원에서는 여기까지만 배운다고 합니다. (여기까지만 알아도 충분하대요)
'Oracle 공부' 카테고리의 다른 글
Day44 - [PL/SQL]예외처리.Exception (0) | 2021.04.19 |
---|---|
Day45 - 프로시저, 매개변수OUT, IN OUT, RETURN (0) | 2021.04.19 |
Day44 - PL/SQL_프로시저, 매개변수 IN (0) | 2021.04.16 |
Day44 - PL / SQL_반복문, 반복제어문 (0) | 2021.04.16 |
Day43 - PL / SQL_IF, CASE문 (0) | 2021.04.15 |