Notice
Recent Posts
Recent Comments
Link
투케이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;
[결과 출력]
반응형
'OracleDB' 카테고리의 다른 글
Comments