특정 테이블(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;

[테스트결과]

 단계1.  삽입(Insert)  단계2.  수정(Update)  단계3. 삭제(Delete)
 
 
 

이런식으로 로그테이블에 해당 이벤트와 BBS_CODE가 아닌
재정의한 게시판 1-3 같은내용이 들어가는것!

오라클DB를 설치 안하더라도,
오라클 클라이언트 혹은 instantclient 를 이용해, 오라클DB를 이용하고자 할때,
가장 많이 접하는 문제들입니다

[1] 한글깨짐
sqlplus에서 select문으로 확인해보면
한글이 ??? 같은 물음표로 나온다면 이렇게 설정해보세요

NLS_LANG=AMERICAN_AMERICA.KO16KSC5601
or
NLS_LANG=KOREAN_KOREA.KO16KSC5601

-유닉스 계열은 export NLS_LANG=AMERICAN_AMERICA.KO16KSC5601 식으로 등록하면 되고
(계속 등록해보려면 .profile 수정하시면 됩니당)

-윈도우 계열은
  시스템 등록정보 -> 고급 -> 환경변수(N)에서 시스템 변수에 넣어주시면 됩니다.

[2] TNSNAMES.ORA 설정파일 예제
>> tnsnames.ora파일은 다음과 같은 형식으로 작성되요.
TNS이름 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 아이피)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = 에스아이디 혹은 네임)
    )
  )

[3] 필수 환경변수 관련 내용들
-TNS_ADMIN=tnsnames.ora가있는폴더
예: TNS_ADMIN=C:\instantclient_11

-ORACLE_HOME=오라클이깔린폴더
예: ORACLE_HOME=C:\instantclient_11

대충 이정도면 오라클클라이언트로
select문으로 확인가능한 정도 사용가능합니다.
sqlplus같은경우는
path에 해당폴더를 추가해두면 편하구요.

sqlplus를 통한 접속방법은
$sqlplus id/pass@TNS
이렇게 접속하는건 모두 아시죠?

오라클에서 테스트 해봤습니다.

뷰생성할때 날짜를 보니 DATE나 CHAR같은 타입이 아니라 NUMBER형으로
데이터가 있더군요...

[상황설명]
예)
DATE
------------
1196324718             ---> 2007-11-29
1196397264             ---> 2007-11-30
1196845476             ---> 2007-12-05

뭥미?
날짜가 아닌 이상한 숫자가 들어있음
규칙성을 찾아보기위해 노력했지만,,, 헛수고 였으나
결국 인터넷에서 해결법을 찾았음


[해결법]
select to_char(to_date('19700101090000','YYYYMMDDHH24MISS')+(DATE/86400),'yyyy-mm-dd [hh24:mi:ss]') as TIME from 테이블;

TIME
-------
2007-11-09 [15:33:04]
2007-11-09 [15:33:29]




select to_char(to_date('19700101090000','YYYYMMDDHH24MISS')+(rdate/86400),'yyyymmdd') as TIME from 테이블;

TIME
-------
20071109
20071109


지식출처:
http://database.sarang.net/?inc=read&aid=22294&criteria=oracle

+ Recent posts