투케이2K

143. (Oracle/오라클) 트리거 (TRIGGER) - 트리거 생성 및 테이블 INSERT, UPDATE 자동 히스토리 로그 삽입 실시 본문

OracleDB

143. (Oracle/오라클) 트리거 (TRIGGER) - 트리거 생성 및 테이블 INSERT, UPDATE 자동 히스토리 로그 삽입 실시

투케이2K 2021. 8. 18. 08:59

[개발 환경 설정]

개발 툴 : Toad

개발 언어 : Oracle


[로직 단계]

- 히스토리 테이블 생성 실시

- 트리거 생성 실시

- UPDATE 및 INSERT 쿼리문 실행 실시

- 히스토리 테이블에 정상적으로 로그가 쌓였는지 확인 실시


[트리거 생성 소스코드]

CREATE OR REPLACE TRIGGER TEST_DEPT_DML_TRIGGER 
   AFTER
   UPDATE ON TEST_DEPT -- [특정 테이블 UPDATE 상태 지정]
   --INSERT ON TEST_DEPT -- [특정 테이블 INSERT 상태 지정]
   FOR EACH ROW

                                               
/***************************************************************
[설 명]

TEST_DEPT 테이블 조작어 (INSERT, UPDATE) 수행 시 로그 기록 트리거
---------------------------------------------------------------

[생성]

edit 창에서 F9를 눌러서 쿼리 실행 시 자동 생성된다
---------------------------------------------------------------

[트리거 호출]

특정 테이블에 이벤트 발생 시 자동으로 수행된다
---------------------------------------------------------------

[트리거 결과]

TEST_HISTORY 테이블에 이벤트 수행 로그 남김
---------------------------------------------------------------

[트리거 목록 조회]

SELECT * 
   FROM ALL_TRIGGERS 
WHERE TRIGGER_NAME = 'TEST_DEPT_DML_TRIGGER'; -- 현재 트리거 이름
---------------------------------------------------------------

[트리거 활성 및 비활성 처리]

ALTER TRIGGER TEST_DEPT_DML_TRIGGER DISABLE; -- 비활성 처리
ALTER TRIGGER TEST_DEPT_DML_TRIGGER ENABLE; -- 활성 처리
---------------------------------------------------------------
              
[트리거 삭제]

DROP TRIGGER TEST_DEPT_DML_TRIGGER;              
****************************************************************/



/******************[전역변수 생성 및 초기화]********************/
DECLARE
M_IDX     VARCHAR2 (100);
M_DATE    VARCHAR2 (100);



/*****************[메인부분 시작 및 커서생성]*******************/
BEGIN

   /*==========[변수값 대입 실시]==========*/
   -- IDX값을 순차적으로 저장하기 위해서 현재 저장된 IDX 최대값을 가져와서 >> M_IDX 변수에 대입 실시
   SELECT MAX(TO_NUMBER(T_HIST_IDX)) INTO M_IDX 
       FROM TEST_HIST;
   
    
   -- 트리거가 수행된 시간을 저장하기 위해서 현재 날짜 확인 >> M_DATE 변수에 대입 실시
   SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') INTO M_DATE
       FROM DUAL;
              
   DBMS_OUTPUT.PUT_LINE('====================================');     
   DBMS_OUTPUT.PUT_LINE('[TEST_DEPT_DML_TRIGGER] : ' || '[M_IDX] : ' || M_IDX);
   DBMS_OUTPUT.PUT_LINE('[TEST_DEPT_DML_TRIGGER] : ' || '[M_DATE] : ' || M_DATE);
   DBMS_OUTPUT.PUT_LINE('====================================');           
   
   
   
   
   /*=========[데이터 널 검증 실시]=========*/      
   IF M_IDX IS NULL OR M_IDX = '' OR M_IDX = 0      
        THEN -- 널 데이터 인 경우 1값으로 삽입
        M_IDX := '1';
   ELSE 
        M_IDX := TO_NUMBER(M_IDX + 1); -- 인덱스값 1증가 실시    
   END IF;
   
   
   
   
   /*====[히스토리 테이블에 로그 저장 실시]====*/
   INSERT INTO TEST_HIST
   (T_HIST_IDX, T_HIST_TBL_NAME, T_HIST_TRI_NAME, T_HIST_ALTER, T_HIST_DATE, T_HIST_NOTE)
   VALUES
   (M_IDX, 'TEST_DEPT', 'TEST_DEPT_DML_TRIGGER', 'UPDATE', M_DATE, '');
   
     
/*******************[트리거 종료 완료 부분]********************/
END TEST_DEPT_DML_TRIGGER;
/

[테이블 생성 및 일반 쿼리문 소스코드]

/*[히스토리 테이블 생성]*/
CREATE TABLE TEST_HIST
(
  T_HIST_IDX  VARCHAR2(100 BYTE) NOT NULL, -- 인덱스
  T_HIST_TBL_NAME  VARCHAR2(100 BYTE) NOT NULL, -- 테이블 이름
  T_HIST_TRI_NAME  VARCHAR2(100 BYTE) NOT NULL, -- 트리거 이름
  T_HIST_ALTER VARCHAR2(100 BYTE) NOT NULL, -- 조작어 이름
  T_HIST_DATE  VARCHAR2(100 BYTE) NOT NULL, -- 현재 날짜
  T_HIST_NOTE  VARCHAR2(100 BYTE) 
);

/*[히스토리 테이블 삭제]*/
DROP TABLE TEST_HIST CASCADE CONSTRAINTS;



-- [TEST_DEPT 목록 확인 쿼리문]
SELECT * --
    FROM TEST_DEPT;



-- [TEST_DEPT 업데이트 쿼리문 - 실제 트리거 동작]
UPDATE TEST_DEPT
      SET
      T_DEPT_IDX = '15', -- 부서 인덱스
      T_DEPT_NAME = '생산부', -- 부서 이름
      T_DEPT_PHONE = '070-123-4567', -- 부서 연락처
      T_DEPT_PLACE = 'P-15' -- 부서 장소
      WHERE 
         TRIM(T_DEPT_IDX) = '15';
         
         
         
-- [TEST_HIST 목록 확인 쿼리문]
SELECT * --
    FROM TEST_HIST;

[결과 출력]


 

반응형
Comments