▶ 뭉충닷컴
 
mungchung.com login
Site Search
My Space
주절주절...
공부방
쥔장소개
Board
자유게시판
유용한 정보
자료실
Programming
강좌 & Articles
Spring 3.0
프로그래밍 Tip
   -ASP
   -PHP
   -JavaScript
   -HTML
   -Java/JSP
   -Database
   -Crystal Report
   -Visual Basic
   -이클립스
   -리눅스
   -기타
Windows API (VB)
Spread Sheet 7.0
컴퓨터활용 Tip
Other things
StarCraft 전략
StarCraft 문서
김용(金庸)
Son Q & Dieda

이미 구축된 사이트 리뉴얼을 할때 커다른 이슈사향중 하나는 DB이관 작업이다. 이 DB이관이 어려운 이유는 리뉴얼시 대부분 DB 의 테이블 구조, 항목등이 변경되기 때문이다.

아예 새로 DB를 구축하고 새로운 구조로 만든후 기존 데이타를 포팅한다면 포팅시에만 주의하면 된다. 근데 새로운 구조가 아닌 기존 DB구조를 그대로 유지한채 몇개의 필드, 몇개의 테이블이 삭제되는 형태로 리뉴얼이 진행된다면 나중에 DB이관 작업시에 하나씩 일일이 소소하게 살펴보느라 힘들다.

물론 꼼꼼한 개발자라면 변경사항을 어딘가에 기록해 두겠지만 지속적으로 변경된 사항을 관리하기란 쉽지 않다. 나도 꼼곰한 성격은 아니지만 나중에 피보기 싫어서 변경된 부분들은 어딘가에 기록을 해두는데 처음에나 열심히 적고 나중에는 귀찮아서 대충 적는다. -_- 이러다보니 리뉴얼 끝난후 DB이관하려 할때 괴로워진다.

그래서 이런 괴로움과 귀찮음을 없애고자 sql문 몇가지 만들었다. 뭐 별건 없다. 단지 원본DB와 변경DB의 테이블들을 비교해서 변경된 사항을 찾아내는것 뿐이다. 뭐..좀 시간 되면 프로시저로 만들어서 원클릭만으로 변경된 DB로 샥~ 하고 바뀌게 했음 좋겠지만 ...요게 좀 위험할것 같다. (귀찮기도 하고 -_-..)

음..원랜 NorthWind DB를 이용해서 원본DB만들고 변경DB 만들어서 sql문 실행하면 삭제된 테이블 변경된 필드..등등 이미지 캡쳐까지 해서 이뿌게 보여주려 했는데.. 귀찮다 -_-

그냥 알아서 NorthWind DB 이용해서 DB하나더 만들고 이리저리 테이블 삭제해보고 필드 변경해보고 해서 스스로 해보길 바란다. (참고로 이미 알고들 있겠지만 NorthWind 테이블 장난쳐서 망가졌다고 해도 C:\Program Files\Microsoft SQL Server\MSSQL\Install 폴더 안의 instnwnd.sql 이용해서 복구할수 있으니 걱정말고 막 이용해도 된다.)

일단! 아래 sql문을 이용하기 전에 각 DB에 view를 하나 만들어 줘야한다. 뭐하는 뷰냐면 현재 DB내의 테이블/뷰/프로시저의 정보를 가져오는 뷰인데...몇년전에 웹으로 테이블 정의서 만들겠다고 난리치면서 만들어둔 뷰이다. (이 뷰는 꽤 유용한것 같다.. 스스로 잘 사용하고 있다 -_-) 아래는 뷰 구조이다.

CREATE VIEW dbo.viewTableInfo AS
select
	distinct
	A.name as	[tbl_id]
	,B.name as	[col_id]
	,C.name as	[data_type]
	,B.length AS	[len]
	,E.text as	[def_val]
	,B.isnullable as	[all_null]
	,B.autoval as	[a_n]
	,D.colid as	[p_k]
	,A.xtype
	,A.id
	,B.colorder	[col_ord]
from
	sysobjects as A
	inner join syscolumns B on A.id=B.id
	inner join systypes as C on C.xusertype=B.xusertype
	left join sysindexkeys as D	on B.id=D.id and B.colid=D.colid
	left join syscomments as E	on E.id=B.cdefault
where
	A.xtype in ('U','V','P')
	and A.status >= 0
	and left(A.name,4) <> 'viewTableInfo'

별거 없다. 귀찮음을 불구하고 설명하자면 아래와 같다.

tbl_id : 테이블명
col_id : 컬럼명(필드명)
data_type : 데이타 타입
len : 데이타 길이
def_val : 기본값
all_null : 널 허용 여부
a_n : 자동증가 여부
p_k : 인덱스 
xtype : U(테이블), V(뷰), P(프로시저)
id : 뭐더라 -_-.. 아마 시스템 내무적으로 인식하는 컬럼 키값일것이다.
colorder : 컬럼 순번

다시한번 말하지만 이 뷰를 변경DB, 원본DB에 각각 생성해 줘야한다. 왜냐면 비교할때 이 뷰를 읽어서 비교하기 때문이다. 아..그리고 용어를 정리하자면 원본DB (OriginalDB), 변경DB (ChangeDB) 이렇게되니 sql문 읽을때 염두해두면된다.

자! 실질적으로 비교시에 사용할 쿼리이다. 설명 없다. 그냥 본다. 휘리릭~

/***** 신규 테이블 */
select
    distinct
    a.tbl_id
from
    ChangeDB..viewTableInfo a
where
    a.xtype='U'
    and a.tbl_id not in (select distinct b.tbl_id from OriginalDB..viewTableInfo b)


/***** 신규 필드 */
select
    a.*
from
    viewTableInfo a
    left join OriginalDB..viewTableInfo b on a.tbl_id=b.tbl_id and a.col_id=b.col_id
where
    a.xtype ='U'
    and b.col_id is null
    and a.tbl_id in (select distinct c.tbl_id from OriginalDB..viewTableInfo c)
order by a.tbl_id, a.col_ord


/***** 변경된 필드 */
select
    a.tbl_id, a.col_id, a.data_type, a.len, a.def_val, a.all_null, a.a_n, a.p_k,
    b.tbl_id, b.col_id, b.data_type, b.len, b.def_val, b.all_null, b.a_n, b.p_k
from
    viewTableInfo a
    left join OriginalDB..viewTableInfo b on a.tbl_id=b.tbl_id and a.col_id=b.col_id
where
    a.xtype ='U'
    and b.col_id is not null
    and (a.len<>b.len 
            or a.data_type<>b.data_type 
            or a.def_val<>b.def_val 
            or a.all_null<>b.all_null 
            or a.p_k<>b.p_k 
            or left(isNull(a.a_n,0),2)<>left(isNull(b.a_n,0),2)
         )
order by a.tbl_id, a.col_ord



/***** 삭제된 테이블 */
select
    distinct
    a.tbl_id
from
    OriginalDB..viewTableInfo a
where
    a.xtype='U'
    and a.tbl_id not in (select distinct b.tbl_id from viewTableInfo b)
   

/***** 삭제된 필드 */ 
select
    a.tbl_id
    , a.col_id
from
    OriginalDB..viewTableInfo a
    left join ChangeDB..viewTableInfo c on a.tbl_id=c.tbl_id and a.col_id=c.col_id
where
    a.xtype='U'
    and c.col_id is null
    and a.tbl_id in (select distinct b.tbl_id from viewTableInfo b)
order by a.tbl_id

 

(후훗.. 이번 글에는 자동으로 코드컬러링 해주는 star-light 이용했다.)

문서 첨부 제한 : 0Byte/ 2.00MB
파일 크기 제한 : 2.00MB (허용 확장자 : *.*)
List of Articles
번호 제목 글쓴이 날짜 조회 수
27 keyfile을 이용한 ssh 접속 방법 뭉충닷컴 2010-10-28 13684
26 멀티 브라우저 지원하는 frame, iframe 접근 코딩 방법 [3] 뭉충닷컴 2010-07-21 26318
25 crontab을 이용한 Tomcat 서버 자동 재시작 shell 뭉충닷컴 2009-08-28 25018
24 자바스크립트로 각 form의 element(요소)에 접근 방법 file [2] 뭉충닷컴 2008-09-11 55965
23 ERwin 에서 Logical의 컬럼명을 코멘트(Comment)로 변경하기 file [2] 뭉충닷컴 2008-01-16 31740
22 Tabular Data Control 마지막 강좌! 뭉충닷컴 2007-06-14 15702
21 ASP로 웹 어플리케이션 주소 사용하기 file 뭉충닷컴 2006-12-10 17907
20 VB로 WebBrowser 컨트롤의 HTML 제어 file 뭉충닷컴 2006-12-01 21389
19 ASP 페이징 쉽게 처리하기 file [4] 뭉충닷컴 2006-08-29 24244
» 두개의 비슷한 DB를 비교해서 변경된 부분 찾아내기 file 뭉충닷컴 2006-05-03 15000
17 ASP에서 Class 를 이용해보자 file 뭉충닷컴 2006-02-26 24770
16 Hotmail의 DHTML EDITOR 편집기를 이용해보자. file [34] 뭉충닷컴 2006-02-04 30232
15 Tabular Data Control 응용 - 제목 Sort (정렬) 쉽게 하기 [3] 뭉충닷컴 2006-01-27 14141
14 스크립트(Script) 코드를 암호화 시켜보자(Encode/Decode) [2] 뭉충닷컴 2005-06-10 19107
13 dll을 이용한 로그인 file [1] 뭉충닷컴 2005-11-25 22021
12 Tabular Data Control 응용 - 페이징 처리하는 3가지 방법 file [1] 뭉충닷컴 2005-11-23 16271
11 Query를 잼있고, 유용하게 사용해보자 file [3] 뭉충닷컴 2005-10-01 14724
10 Tabular Data Control 응용 - 테이블의 행 배경색이 격으로 변하게하기 뭉충닷컴 2005-09-25 15796
9 폼(Form) 검증해주는 스크립트(Script) file [15] 뭉충닷컴 2005-06-07 19262
8 asp 로 서버에 zip 압축/압축해제(풀기) 예제 file [8] 뭉충닷컴 2005-08-12 19746
7 MS-SQL의 osql.exe 이용 하기 (도스상에서 sql 구문 이용) 뭉충닷컴 2005-09-25 19302
6 SQL Script 로 ERD와 테이블 생성 손쉽게하기 뭉충닷컴 2005-09-25 21602
5 Tabular Data Control 기초 다지기 4 - 마지막! file 뭉충닷컴 2005-09-25 14683
4 Tabular Data Control 기초 다지기 3 file 뭉충닷컴 2005-09-25 14477
3 Tabular Data Control 기초 다지기 2 file 뭉충닷컴 2005-09-25 14182
2 Tabular Data Control 기초 다지기 1 file [1] 뭉충닷컴 2005-09-25 15222
1 OWC를 이용한 웹에서 엑셀 그래프 그리기 file [4] 뭉충닷컴 2007-12-19 18974