참고
- 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번만 출력하는 것 : 문장단위 트리거
2. 사원번호 105번 사원을 퇴직처리하시오. 사원테이블의 퇴직일자를 오늘날짜로 변경하시오.
- 단, 사원테이블의 퇴직자 정보를 퇴직자테이블(RETIRE)에 보관하시오
- 행단위 트리거 : 퇴직자 여러명일수도 있으니까
준비과정
- 퇴직자 정보를 저장하는 테이블 RETIRE를 생성하시오
트리거 생성
- 행단위 트리거 : 퇴직자 여러명일수도 있으니까
이벤트
트리거로 인한 RETIRE 테이블
105번 DELETE하고 싶었는데 안되서 UPDATE로 바꾼거, 만약 DELETE하고싶다면 ON DELETE CASCADE 설정해야함. REMAIN1이 남는 테이블이라 여기다가 실험해본거
- 테이블 REMAIN1에 기본키 설정
3. 오늘이 2005년 8월 1일이라고 가정하고 제품코드 'P201000007'인 상품을 회원번호가 'r001'인 회원이 5개 구매했다고 하자. CART테이블에 해당 데이터를 추가하고 재고수불테이블을 변경하시오
- 행단위 트리거: 여러개 발생할 수 있기 때문에
트리거 함수
- 트리거내 이벤트가 INSERT OR UPDATE OR DELETE 로 여러개 쓰일 때, 수행문장을 다르게 실행시키기 위해 쓴다.
1) INSERTING
2) UPDATING
3) DELETING
예시