[Oracle] 트리거(Trigger)

HanSamDul·2024년 1월 11일

트리거 (TRIGGER)

  • 트리거는 데이터베이스 시스템에서 데이터의 입력, 갱신, 삭제 등의 이벤트가 발생하 때마다 자동적으로 수행되는 사용자 정의 프로시저이다.
  • 트리거는 TABLE과는 별도로 DATABASE에 저장된다.
  • 트리거는 VIEW에 대해서가 아니라 TABLE에 관해서만 정의될 수 있다.
  • 제약조건과 함께 데이터 무결성을 지키는 하나의 방법으로써 특정 이벤트에 대해서 연속적으로 자동 동작하는 특수한 형태의 저장 프로시저라고 볼 수 있다.

CREATE OR REPLACE TRIGGER 트리거명
BEFORE | AFTER (INSERT, UPDATE, DELETE)
ON 테이블명  
REFERENCING  NEW | OLD  TABLE AS 테이블명
[ FOR EACH ROW ][ WHEN 조건식 ]
DECLARE
    선언문  
BEGIN
    PL/SQL 코드  
END;

  • OR REPLACE : 생성할 트리거와 같은 이름을 가지고 있어도 무시하고 새로운 것으로 갱신하는 것이므로 사용할 때 주의

  • AFTER : 테이블이 변경된 후에 트리거가 실행

  • BEFORE : 테이블이 변경되기 전에 트리거가 실행

  • NEW : 새로 추가되거나 변경된 후의 값에 트리거가 적용 (INSERT : 입력할 값, UPDATE: 수정할 값)

  • OLD : 변경 전의 값에 트리거가 적용 (UPDATE: 수정 전 값, DELETE: 삭제할 값)

  • [FOR EACH ROW [WHEN TRIGGER 조건]]
    FOR EACH ROW 를 쓰면 row(행) 트리거를 생성하고 WHEN 조건을 주면 WHEN 조건에 만족하는 ROW(행)만 트리거 적용
    즉,FOR EACH ROW를 안쓰면 statement(문장) 트리거 생성

문장(statement) 트리거는 트리거가 설정된 테이블에 여러 행이 변경되더라도 오직 한번만 실행 되는 트리거.
행(row) 트리거는 조건을 만족하는 여러 개의 행에 대해 트리거를 반복적으로 여러번 수행 하는 트리거.
예를들어,emp 테이블에 10명의 사원이있고, UPDATE emp SET 급여 = 급여 * 1.1; 이라는 문장이 실행되면 where조건이 없기때문에
10명의 급여가 모두 오르는데, 문장 트리거는 10명이 다 오르기전,오른 후 에 한번 딱 실행하는 트리거이고,
행(row) 트리거는 1명 오르기 전,후 에 실행하고 2번째 사원 오르기 전,후에 실행하고 총 10번을 실행하는 트리거.
따라서, 자신이 원하는 기능에 따라 원하는 트리거를 잘 선택해서 써야될듯.

CREATE OR REPLACE TRIGGER PREMIER_PLM.TT_PDM_PART_XM010
AFTER INSERT OR UPDATE OR DELETE
ON PREMIER_PLM.PDM_PART
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE

BEGIN

    IF INSERTING THEN
        -- SKW 신규 품목 생성 시 XM010 생성 
        INSERT INTO XM010_TEST(COMPANYCD, APNO, APNONM, KINDCD,
                                USEYN,
                                LOGIN_ID,LOGIN_YMD, LOGIN_C)
        VALUES (:NEW.CMPY_SN, :NEW.PART_NO, :NEW.PART_NM,:NEW.KIND_CD,
                'Y',
                :NEW.CREATE_ACC_NO,:NEW.CREATE_DATE, :NEW.CMPY_SN);  
    
    ELSIF UPDATING THEN
        -- 단순 UPDATE
        UPDATE XM010_TEST
            SET APNONM = :NEW.PART_NM
              , KINDCD = :NEW.KIND_CD
              , LOGIN_ID = :NEW.UPDATE_ACC_NO 
              , LOGIN_YMD   = :NEW.UPDATE_DATE
        WHERE COMPANYCD = :NEW.CMPY_SN 
          AND APNO = :NEW.PART_NO;

    ELSIF DELETING THEN
--        DELETE FROM XM010_TEST 
--        WHERE COMPANYCD = :OLD.CMPY_SN 
--        AND APNO = :OLD.PART_NO;
        UPDATE XM010_TEST
            SET USEYN = 'N'
              , LOGIN_ID = :NEW.UPDATE_ACC_NO 
              , LOGIN_YMD   = :NEW.UPDATE_DATE
        WHERE COMPANYCD = :NEW.CMPY_SN 
          AND APNO = :NEW.PART_NO;
    
    END IF;   

END;
/

0개의 댓글