참고
- 2020-09-02-01)Trigger.sql
- 2020-09-02-02)Trigger2.sql
Trigger
- 어떤 이벤트가 발생하면 자동적으로 실행되는 프로시져 일종
- 트리거 안에 트리거 중첩 불가 => 블로킹 발생
- 블로킹: 일관성이 파괴되기때문에 데이터보호를 위해 시스템에서 테이블 접근금지내림
- 컴파일 시에는 괜찮은데 실행하면 오류잔치
- ex) 수행중에 다른 곳을 수행 하고 오면 원본데이터를 또 수정하러가야하고... 반복
- 트리거 안에서는 DCL(COMMIT, ROLLBACK,SAVEPOINT) 안됨
사용형식
트리거 유형
1. 문장단위 트리거
- 이벤트가 발생되었을 때 한번만 트리거 발생
- 'FOR EACH ROW' 생략
- :NEW, :OLD와 같은 의사레코드 사용 가능
2. 행단위 트리거
- 이벤트(I/U/D)에 의해 여러 행이 영향 받는 경우 각 행(=커서의 각 행)마다 트리거 발생.
- 'FOR EACH ROW' 기술해야 함
- :NEW, :OLD와 같은 의사레코드 (pseudo record) 사용 가능
- :NEW
- INSERT, UPDATE문에 사용.
- 데이터가 삽입(갱신)될 때 새로 들어온 값 (ex :NEW.CART_QTY 새판매량)
- DELETE에는 모든 값이 NULL이다.
- :OLD
- DELETE,UPDATE문에 사용.
- 데이터가 삭제(갱신)될 때 존재하고 있는 값. (ex. :OLD.REMAIN_J_99 기존기말재고)
- INSERT에는 모든 값이 NULL이다.
- ( * rownum : pseudo column)
- ★ 하나의 트리거가 종료되지 않은 상태에서 다른 트리거 호출 불가
트리거 조건 WHEN
- 행단위 트리거에서만 사용 가능
- 이벤트가 발생된 때, 보다 구체적인 검색 조건 부여할 때 기술
예시
1. 분류테이블에 새로운 데이터 하나를 입력하라. 입력된 후 '새로운 분류코드가 입력됨'을 출력하는 트리거를 작성하쇼
- 분류코드 입력 후 1번만 출력하는 것 : 문장단위 트리거
![](https://velog.velcdn.com/images%2Fgodkimchichi%2Fpost%2Fcd2b7a53-0da5-466b-a294-5d6a0e80d789%2Fimage.png)
![](https://velog.velcdn.com/images%2Fgodkimchichi%2Fpost%2F168430f3-5886-4516-b0a3-4d28c2c9ef29%2Fimage.png)
![](https://velog.velcdn.com/images%2Fgodkimchichi%2Fpost%2F78eaa7d5-cf69-441f-8504-d1348e35335b%2Fimage.png)
![](https://velog.velcdn.com/images%2Fgodkimchichi%2Fpost%2Fc8a22b34-31a0-44fa-9f3d-0462eec46aa8%2Fimage.png)
![](https://velog.velcdn.com/images%2Fgodkimchichi%2Fpost%2Fcb4fb98b-4bc6-43da-b3d8-fca2317c00e4%2Fimage.png)
2. 사원번호 105번 사원을 퇴직처리하시오. 사원테이블의 퇴직일자를 오늘날짜로 변경하시오.
- 단, 사원테이블의 퇴직자 정보를 퇴직자테이블(RETIRE)에 보관하시오
- 행단위 트리거 : 퇴직자 여러명일수도 있으니까
준비과정
- 퇴직자 정보를 저장하는 테이블 RETIRE를 생성하시오
트리거 생성
- 행단위 트리거 : 퇴직자 여러명일수도 있으니까
![](https://velog.velcdn.com/images%2Fgodkimchichi%2Fpost%2F47590443-b0bb-4f6e-a177-c079f2655a15%2Fimage.png)
![](https://velog.velcdn.com/images%2Fgodkimchichi%2Fpost%2Fe85d5f92-b633-48eb-a2b9-dd1e96b2ea5d%2Fimage.png)
이벤트
트리거로 인한 RETIRE 테이블
105번 DELETE하고 싶었는데 안되서 UPDATE로 바꾼거, 만약 DELETE하고싶다면 ON DELETE CASCADE 설정해야함. REMAIN1이 남는 테이블이라 여기다가 실험해본거
- 테이블 REMAIN1에 기본키 설정
![](https://velog.velcdn.com/images%2Fgodkimchichi%2Fpost%2F49e28cad-eea2-4c9c-97ec-c2da019e90e0%2Fimage.png)
3. 오늘이 2005년 8월 1일이라고 가정하고 제품코드 'P201000007'인 상품을 회원번호가 'r001'인 회원이 5개 구매했다고 하자. CART테이블에 해당 데이터를 추가하고 재고수불테이블을 변경하시오
- 행단위 트리거: 여러개 발생할 수 있기 때문에
![](https://velog.velcdn.com/images%2Fgodkimchichi%2Fpost%2Fc7f83a8b-a1ff-46ae-8a57-d30f96eda67b%2Fimage.png)
![](https://velog.velcdn.com/images%2Fgodkimchichi%2Fpost%2F7652046e-353c-433b-bef6-19327c6663fc%2Fimage.png)
![](https://velog.velcdn.com/images%2Fgodkimchichi%2Fpost%2Ffe37701d-09f1-4f5e-8dcd-db59684918c9%2Fimage.png)
![](https://velog.velcdn.com/images%2Fgodkimchichi%2Fpost%2Ffbaeed6a-2878-48e6-a4d7-e2432b17f09f%2Fimage.png)
![](https://velog.velcdn.com/images%2Fgodkimchichi%2Fpost%2F8757a2ab-e3ce-42e0-ae4b-682d89991427%2Fimage.png)
트리거 함수
- 트리거내 이벤트가 INSERT OR UPDATE OR DELETE 로 여러개 쓰일 때, 수행문장을 다르게 실행시키기 위해 쓴다.
1) INSERTING
2) UPDATING
3) DELETING
예시