특정 테이블(DATA_TBL)에 대해서 트리거를 걸고,
해당 이벤트를 기록하는 테이블(LOG_TBL) 이 존재한다고 할때, 테이블당 하나씩
트리거를 걸면 되므로 심플하게 되는데...
종종 이런로그를 쌓을때, 특정 자료들을 가공해서 써야 할때가 있습니다.
게시판코드 | 게시판번호 | 제목 | 본문 |
BBS_001 | 0001 | 테스트제목1 | 본문입니다 |
BBS_001 | 0002 | 테스트제목2~ | 본문2 |
BBS_004 | 001 | 어때..이힝 | 정민철 메롱 |
다수의 게시판이 아니라,
하나의 게시판에 게시판 코드로 구분되어 만들어 지는 경우...
게시판 코드가 아니라...
BBS_001 , BBS_002, BBS_003 게시판은 ===> 멀티미디어게시판
BBS_004 , BBS_005, BBS_006 게시판은 ===> 텍스트게시판
나머지 ===> 기타게시판
뭐 묶음으로 로그를 남긴다고 해야하나??
아니면 분류를 새로 해서 로그를 남긴거나 아무튼 이런겁니다.
[샘플예제]
오라클기준으로 작성하였답니다
> KONAN_TEST (트리거가 걸릴 테이블)
BBS_CODE | TITLE | BODY |
> KONAN_TEST_LOG (KONAN_TEST의 로그가 쌓일곳)
LOGID (로그고유번호 rowid로함) | TABLENAME (해당 테이블명) | EVENT (업데이트, 삽입, 삭제) |
> kw_logtest
create or replace
TRIGGER kw_logtest
AFTER INSERT OR DELETE OR UPDATE ON KONAN_TEST
FOR EACH ROW
DECLARE
tbl_name VARCHAR2(30) := ''; --테이블명
BEGIN
-- 테이블코드 가져오기
IF INSERTING THEN
IF (UPPER(:new.BBS_CODE) in ('BBS_01', 'BBS_02', 'BBS_03')) THEN
tbl_name := '게시판1-3';
ELSIF (UPPER(:new.BBS_CODE) in ('BBS_04', 'BBS_05', 'BBS_06')) THEN
tbl_name := '게시판4-6'
ELSE
tbl_name := '기타게시판';
END IF;
ELSE
IF (UPPER(:old.BBS_CODE) in ('BBS_01', 'BBS_02', 'BBS_03')) THEN
tbl_name := '멀티미디어게시판';
ELSIF (UPPER(:old.BBS_CODE) in ('BBS_04', 'BBS_05', 'BBS_06')) THEN
tbl_name := '게시판1-3';
ELSE
tbl_name := '게시판4-6'
END IF;
END IF;
--실제로그쌓기
IF INSERTING THEN
INSERT INTO KONAN_TEST_LOG(LOGID,TABLENAME, event)
VALUES(:new.rowid, tbl_name ,'I');
ELSIF DELETING THEN
INSERT INTO KONAN_TEST_LOG(LOGID,TABLENAME, event)
VALUES(:old.rowid, tbl_name, 'D');
ELSIF UPDATING THEN
INSERT INTO KONAN_TEST_LOG(LOGID,TABLENAME, event)
VALUES(:old.rowid,tbl_name, 'U');
END IF;
END;
TRIGGER kw_logtest
AFTER INSERT OR DELETE OR UPDATE ON KONAN_TEST
FOR EACH ROW
DECLARE
tbl_name VARCHAR2(30) := ''; --테이블명
BEGIN
-- 테이블코드 가져오기
IF INSERTING THEN
IF (UPPER(:new.BBS_CODE) in ('BBS_01', 'BBS_02', 'BBS_03')) THEN
tbl_name := '게시판1-3';
ELSIF (UPPER(:new.BBS_CODE) in ('BBS_04', 'BBS_05', 'BBS_06')) THEN
tbl_name := '게시판4-6'
ELSE
tbl_name := '기타게시판';
END IF;
ELSE
IF (UPPER(:old.BBS_CODE) in ('BBS_01', 'BBS_02', 'BBS_03')) THEN
tbl_name := '멀티미디어게시판';
ELSIF (UPPER(:old.BBS_CODE) in ('BBS_04', 'BBS_05', 'BBS_06')) THEN
tbl_name := '게시판1-3';
ELSE
tbl_name := '게시판4-6'
END IF;
END IF;
--실제로그쌓기
IF INSERTING THEN
INSERT INTO KONAN_TEST_LOG(LOGID,TABLENAME, event)
VALUES(:new.rowid, tbl_name ,'I');
ELSIF DELETING THEN
INSERT INTO KONAN_TEST_LOG(LOGID,TABLENAME, event)
VALUES(:old.rowid, tbl_name, 'D');
ELSIF UPDATING THEN
INSERT INTO KONAN_TEST_LOG(LOGID,TABLENAME, event)
VALUES(:old.rowid,tbl_name, 'U');
END IF;
END;
[테스트결과]
단계1. 삽입(Insert) | 단계2. 수정(Update) | 단계3. 삭제(Delete) |
이런식으로 로그테이블에 해당 이벤트와 BBS_CODE가 아닌
재정의한 게시판 1-3 같은내용이 들어가는것!