트리거

수호천사임다·2024년 9월 25일

오라클

목록 보기
50/53

트리거란 ?

  • 미리 정해 놓은 특정 조건이 만족하거나 어떤 동작이 수행하면 자동으로 실행하도록 정의한 동작
  • 예를 들어 DML(INSERT, UPDATE, DELETE) 문장이 실행하거나 DDL(CREATE, ALTER, DROP) 문장이 실행될 때 트리거가 실행될 수 있다.
  • 트리거는 CREATE TRIGGER 시스템 권한이 있어야 생성 가능하다.
  • 트리거 내에서의 DML은 자동 COMMIT/ROLLBACK 되므로 COMMIT 하지 않는다.
  • 트리거는 데이터 무결설 유지, 감사 기록 관리 등에 유용

트리거 유형

  • DML 트리거
  • INSTEAD OF 트리거
  • 시스템 트리거

문장 트리거

  • 하나의 DML 문에서 트리거는 한번 일어난다.
  • 예를 들어 DELETE FROM 테이블; 문장으로 5개의 레코드가 삭제 되어도 트리거도 한번 실행 된다.
  • 테이블의 레코드가 입력, 수정, 삭제 등의 로그 기록

행 트리거

  • DML 문에서 조건만족하는 모든 행에 대하여 트리거가 일어난다.
  • 예를 들어 DELETE FROM 테이블; 문장으로 5개의 레코드가 삭제한 경우 트리거는 5번 실행 된다.
    행은 데이터가 INSERT만큼, 업데이트만큼 실행한다

트리거 정보 확인

USER_TRIGGERS
USER_SOURCE 
SELECT * FROM user_triggers;

트리거를 생성하기 위한 권한

  • 트리거를 생성하거나 삭제하기 위해서는 사용자는 시스템 권한 중의 하나인 CREATE TRIGGER 권한을 가져야한다.
GRANT CREATE TRIGGER TO 사용자;

사용자의 시스템 권한 확인

SELECT * FROM user_sys_privs;

트리거가 실행되는 시기

  • BEFORE
    - 테이블의 DML 트리거 이벤트 전에 트리거 본문이 실행
  • AFTER
    - 테이블의 DML 트리거 이벤트 후에 트리거 본문이 실행
  • INSTEAD OF
    - 트리거 이벤트를 실행하지 않고 트리거 본문을 실행한다. INSTEAD OF 트리거는 테이블이 아니라 뷰에 대해서
    만 정의한다.

트리거 생성

  • 구문형식
CREATE TRIGGER 트리거명
AFTER [INSERT/UPDATE/DELETE]  -- 또는 BEFORE
ON 테이블명
FOR EACH ROW
BEGIN
    -- 실행할 구문
END;
  • BEFORE : 테이블의 DML 트리거 이벤트 전에 트리거 본문이 실행된다.
  • AFTER : 테이블의 DML 트리거 이벤트 후에 트리거 본문이 실행된다.
  • INSTEAD OF : 트리거 이벤트를 실행하지 않고 트리거 본문을 실행한다. INSTEAD OF 트리거는 테이블이 아니라 뷰에 대해서만 정의한다.

트리거 분류

  • 트리거 이벤트가 발생할 때마다 트리거 본문 실행 횟수에 따라 문장 문장 트리거와 행 트리거로 나눈다.

문장 트리거

  • 트리거가 설정된 테이블에 트리거 이벤트가 발생하면 많은 행에 대해 변경 작업이 발생하더라도 오직 한번만 트리거를 발생시킨다.

행 트리거

  • 조건을 만족하는 여러 개의 행에 대해 트리거를 반복적으로 수행하는 방법으로 [FOR EACH ROW | WHEN 조건 ]절을 정의된다.

트리거 생성 및 관리

  • 하나의 테이블에 동일한 명령문에 대해여 두개 이상의 트리거가 정의된 경우 실행 순서
    1) BEFORE 문장 트리거
    2) BEFORE 행 트리거
    3) AFTER 문장 트리거
    4) AFTER 행 트리거

트리거 관리

  • 트리거 활성화 및 비활성화
    ALTER TRIGGER 트리거이름 [ENABLE | DISABLE];

  • 테이블에 속한 트리거 활성화 및 비활성화
    ALTER TABLE 테이블명 { ENABLE | DISABLE } ALL TRIGGERS;

  • 트리거 상태 확인
    SELECT 테이블명, 상태 FROM user_triggers;

  • 트리거 수정 후 재 컴파일
    ALTER TRIGGER 트리거이름 COMPILE;

  • 트리거 삭제
    DROP TRIGGER 트리거이름;

CREATE OR REPLACE TRIGGER testTrigger
BEFORE INSERT OR UPDATE OR DELETE ON test
BEGIN
  IF TO_CHAR(SYSDATE, 'D') IN(1,7) OR -- 주말
     --  ( TO_CHAR(SYSDATE, 'HH24') < 9 OR TO_CHAR(SYSDATE, 'HH24') > 18) THEN
    ( TO_CHAR(SYSDATE, 'HH24') >= 15 AND TO_CHAR(SYSDATE, 'HH24') <= 16) THEN
      RAISE_APPLICATION_ERROR(-20001, '데이터 수정 할 수 있는 시간이 아님');
  END IF;
END;
/


CREATE OR REPLACE TRIGGER testinfoTrigger
AFTER INSERT OR UPDATE OR DELETE ON test
BEGIN
  IF INSERTING THEN
      INSERT INTO test_info(memo) VALUES ('추가');
  ELSIF UPDATING THEN
      INSERT INTO test_info(memo) VALUES ('수정');
  ELSIF DELETING THEN
      INSERT INTO test_info(memo) VALUES ('삭제');   
  END IF;
END;
/
--  다음과 같은 방법을 이용하여 관련된 트리거는 하나의 트리거로 작성 할 수 있다.
-- IF INSERTING THEN 
--    추가할 때 
-- ELSIF UPDATING THEN
--    수정할 때 
-- ELSIF DELETING THEN
--    삭제할 때 
--   END IF;

0개의 댓글