참고

  • 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

  • 트리거의 이벤트가 INSERT이면 참

2) UPDATING

  • 트리거의 이벤트가 UPDATE이면 참

3) DELETING

  • 트리거의 이벤트가 DELETE이면 참

예시

profile
갈 길이 멀다

0개의 댓글