database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 23829 게시물 읽기
No. 23829
루프 범위를 지정할 쿼리 질문
작성자
ZEROS
작성일
2005-08-26 11:43
조회수
1,807

로그 테이블에 있는 데이터들을 어느 특정 날짜까지 읽어들여서 백업 테이블에 넣을려고 합니다.

 

그런데 그 특정날짜까지 루프를 돌려서 insert 시켜줘야 하는데 범위를 지정하는 쿼리를 만들려고

 

하는데 어떻게 해줘야할까요? 루프 범위를 지정할 쿼리를 좀 부탁 드립니다 ...

이 글에 대한 댓글이 총 6건 있습니다.

 

테이블 구조와 원하는 목적을 정확히 올려주십시오.^^

 

단순히 루프범위라는 것은?

 

절차적으로 풀어보았을때 루프 아닌 것이 있나요?

 

김흥수(protokhs)님이 2005-08-26 12:56에 작성한 댓글입니다.

테이블 두개가 같은 칼럼으로 구성되어있습니다. 그런데 하나는 그때 그때 로그가 쌓이는 로그테이블의 역활이고 다른 하나는 백업이란 버튼을 클릭했을때 입력을 받은 날까지의 데이터가 백업 테이블에 쌓이게 됩니다. 그런데 백업을 하고난 뒤엔 로그 테이블에 있는 데이터는 삭제가 이루어집니다. 그래서 그 루프의 범위라는 것이 이전의 백업받은 후의 날짜부터 지정한 날짜까지의 날수 계산을 해서 그 날수만큼

insert가 이루어지는것입니다.

zeros님이 2005-08-26 13:35에 작성한 댓글입니다. Edit

로그 테이블의 구조와 백업테이블의 구조

그리고 어떤기준으로 백업이 되고 삭제는 어떤자료가 되는지를 알려주심이...

 

원하시는 바를 대략적인 설명만으로는 알 수가 없습니다.

 

예를 들어

 

로그테이블의  구조가

로그순번     number primary key,

로그생성일  date,

로그데이타  varchar2(4000)

 

이런 식인가요?

 

백업테이블도 동일 구조이던가

아니면 실제백업일이라는 컬럼이 더 있다던가...

 

그리고 님의 말씀대로이고 테이블 구조가 위와 같다면 제가 이해하기에는 사용자가 현재 로그테이블에 있는 자료를 백업으로 옮기고 옮겨진 자료는 삭제를 한다는... 그런 말씀이신듯 한데요...

 

insert into 백업테이블

(

....

)

select

.....

from 로그테이블

where 로그생성일 between :a And :b;

delete 로그테이블

where 로그생성일 between :a And :b;

 

이렇게 하시면 안되는 이유가 있어서 질문을 올리신 것 같은데요...

 

그 부분이 무엇인지 좀 자세히 알려주십시오.

테이블 레이아웃과 백업대상 조건 , 로그에서 삭제될 자료의 조건...

이런거를...

김흥수(protokhs)님이 2005-08-27 19:33에 작성한 댓글입니다.
이 댓글은 2005-08-27 19:33에 마지막으로 수정되었습니다.

접속 일자   varchar2 primary key,

업무 구분   char primary key,

프로그램ID varchar2 primary key,

접속 순번  number primary key,

프로그램명  varchar2,

회원ID varchar2,

주민번호 varchar2,

접속아이피 varchar2,

로그일자 시간 분초 sysdate

 

로그테이블과 로그 백업 테이블 두개의 테이블의 구조는 위와 동일합니다.

백업 데이터에 옮겨져야 할것은 로그일자 시간 분초 외에 모든 것이 옮겨져야 하고 백업테이블의 로그일자 시간 분초는 옮겨진 시스템시간을 넣습니다.

 

zeros님이 2005-08-29 10:31에 작성한 댓글입니다. Edit

저 솔찍히 아직도 님께서 무엇을 원하시는지는 잘 모르겠습니다.

첫번째로는 어떤 범위의 자료를 백업으로 옮기시는지 그 옮기는 조건을 모르겠구요(가령 로그에 대한 관리자가 있어서 현재 로그를 전부 백업으로 옮기고 삭제해버린다든지... 아니면 특정일자 기준으로 그 시점 이전에 발생한 로그는 백업하고 삭제한다든지... 분명히 로그를 관리하는 업무적 기준이 있을것이라 생각합니다.)

두번째는 제약사항을 모르겠습니다. 즉 질문이 막연합니다.

예를 들어 로그는 백업을 받는 시점에서도 계속 쌓이는데.... 반드시 백업된 로그만 삭제 되어야 한다든지(이런 경우라면 당일 로그의 백업이겠죠? 만약 과거 특정 시점까지의 로그를 백업하는 문제라면 로그를 백업중인데 해당 일자로 로그가 쌓이는 일은 없을 테니까요.)

아니면 아무 제약이 없이 단지 백업을 받기만 하면 된다든지.

 

그런데 저도 계속 님께 이거 확실히 해달라 저거는 무어냐? 물어만보고 남은 답답한데 대답은 안해주고 이거 뭐하는 거야?

이러실까봐

 

그냥 제가 나름대로 로그와 백업에 대한 의견을 적습니다...

 

1. 님이 올려주신 테이블 레이아웃을 보면 먼저 로그가 발생하기 위한 설계 부분에 약간 문제가 있다고 봅니다.

그 이유는 로그는 어디까지나 로그라고 봅니다. 즉 로그 저장의 실패가 원 거래의 실패이어서는 안된다는 게 제 생각이구요.

그렇다면 님의 테이블의 키부분은 유일키 생성에서 실패할 가능성을 갖는 설계가 아닌가 싶습니다. 로그에는 사실 primary key는 단순 순번의 NUMBER(38) 이거만 있고 이것도 SEQUENCE로 키 할당 받으면 그만인것 아닐런지... 나머지는 다 정보 컬럼이어도 무방하다는 것이구요...

대개의 경우 로그에 대한 질의는 복합적이기 보다 중요 몇컬럼만 조건 대상이 되는 경향이 있거든요... 그러면 그부분만 인덱스 걸어주심 될 듯 합니다.

 

2. 만약 제약조건이 로그를 백업하는 조건이 무엇이든 반드시 백업이 된 것만 삭제되어야 한다면....더더군다나 키는 단순 NUMBER인 것이 유리합니다.
(왜냐면 그래야 delete시에 exists 절을 사용할 때 SQL도 단순하고 수행 성능도 좋습니다.)

 

3. 로그의 키가 단순 number에 자동 발행되는 순번이라면 프로그래머가 로그를 남기는 입장에서 dup 에러를 신경쓸 필요없는 일종의 마구쓰기가 되므로 데이타 측면만을 생각하면 되는 일종의 캡슐화 효과도 누릴 수 있습니다.

 

이상의 가정으로 로그및 로그 백업을 하는데.... 로그 백업의 경우는 무조건 현재 생성된 모든 로그를 백업 후 원본 로그에서는 삭제를 한다는 기준으로 해보면

로그생성번호 number primary key,

접속 일자   date,

업무 구분   char,

프로그램ID varchar2,

접속 순번  number,            --접속순번의 의미가 있는 것인가요? 없고 단지 키구성을 위한 것이면 없애셔도 됩니다.

프로그램명  varchar2,

회원ID varchar2,

주민번호 varchar2,

접속아이피 varchar2,

로그일자시간분초 date

 

이정도의 구성일 듯 싶습니다.

 

로그테이블,로그백업테이블 이 있고요

로그를 백업하는 것은

insert into 로그백업테이블

(

로그생성번호,

접속일자,

업무구분,

프로그램ID,

접속순번,

프로그램명,

회원ID,

주민번호,

접속아이피,

로그일자시간분초

)

select

로그생성번호,

접속일자,

업무구분,

프로그램ID,

접속순번,

프로그램명,

회원ID,

주민번호,

접속아이피,

sysdate

from 로그테이블;

delete 로그테이블 a

where exists

(

select null from 로그백업테이블 b

where a.로그생성번호 = b.로그생성번호

);

commit;

 

 

이정도의 수순이 아닐런지..^^

 

자세히 올려주실수록 답변도 자세히 될 수 있으리라는...

김흥수(protokhs)님이 2005-08-30 00:59에 작성한 댓글입니다.

네 님의 의견 잘 알지만 ... 이직을 하고 나서 막바지에 있는 것에 참여한 터라 수정을 할 수 도 없는 상황이고 전 어느정도의 일부분만을 도와주다 다른 것으로 일을 옮기는지라 저도 곤란한 상황입니다.

일단은 범위라고 하시면 제일첨 올린 글로 부족할까요?

로그테이블은 일단은 메뉴에 사용자가 접근을 했을때 발생을 하고

백업은 일단은 1년을 주기로 한번 이루어지는 것으로 알고 있습니다.

그리고 그 1년동안의 로그는 삭제가 이루어지고요.

하지만 백업을 꼭 1년을 주기로 한다고 단정을 지을 순 없구요.

시스템의 상황에 따라 변할 수 있기때문에 유연성을 두기 위해 날짜 지정을 할 수 있도록 했습니다. 그래서 화면에 보이는 것은 일단은 현재날짜가 출력이 되도록 되어있고 관리자의 임의에 따라 날짜 변경이 가능합니다. 그러니 이전에 백업을 했을경우엔 백업을 하지 않은 로그만 남아있는 상태입니다. 그래서 루프의 첫번째는 백업이 이루어지지 않은 첫번째 날이 될 것이고 루프의 마지막 범위는 관리자가 지정한 날짜가 되는 것입니다. 그러니 로그일자 시분초 라는 칼럼으로 조건을 삼겠죠.. primary key에 대해선 앞에서 얘길 했듯이 제가 막바지에 들어간 터라 어떻게 수정을 할 수 있는 부분들이 아닌지라 더욱이 다른 것들이랑 연결이 되어 있는 칼럼들도 있는 상황입니다.

제가 말을 하는데 서툴러서 어떻게 알아들으셨는지 모르겠습니다.

 

zeros님이 2005-08-30 08:43에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
23832partition 된 테이블의 index 를 rebuild 하려는데 애러나요. [1]
서지수
2005-08-26
4538
23831DBA권한 설정?
sky
2005-08-26
1248
2383016123 에 대해서...다시 한번만.. [5]
또몰라
2005-08-26
907
23829루프 범위를 지정할 쿼리 질문 [6]
ZEROS
2005-08-26
1807
23828DB 동기화.. [5]
질문있어용^^
2005-08-26
2736
23827import할때 에러가.... [1]
이수호
2005-08-26
1853
23826row 의 insert 된 시간을 알 수 있는 방법이 있을까요? [1]
김진모
2005-08-26
1566
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.019초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다