CAFE

MS-SQL 서버

12.DTS(Date Transfer Service)...http://sqler.pe.kr/에서

작성자레인|작성시간04.09.20|조회수348 목록 댓글 0

1. DBMS간 데이터 전송에 대한 이해

 

이번에 소개해드릴 내용은 한번쯤은 사용해 보셨을.. DTS라는 녀석에 대한 이야기

입니다.

 

이러한 수행으로.. 해당DB선택 -> 모든작업 에서.. 데이터 가져오기나 내보내기를

이용 DTS작업을 수행 하셨거나..

 

이렇게.. 데이터 가져오기 및 내보내기툴을 이용해서 작업을 해본 적도 

있으실 겁니다.

 

뭐 좋습니다. 

"한번쯤 다 해 봤고.. 알고 있는데 이런 야그 왜하냐 "  -_-;;

네.. 물론 알고는 계시겠지만. . 놓치고 지나치신 부분... 그리고 알아두시면

대단히 유용하게 작업 하실 수 있는... 그런 부분역시 설명을 드리려 한답니다. ^_^

 

또한.. DTS를 프로젝트에 한번 사용하시는 분도 계실것이고.. 데일리 배치, 위클리배치

등.. 여러 작업을 수행하시는 분들도 계실 것입니다.

프로젝트 개발 완료후.. 프러덕션 서버에 전송하기 위한 용도로 한번...

사용하시는 분... 매일매일 데이터의 동기화를 위해.. 원격지의 서버에 전송 작업을

하셔야 하는 분들.. 등 여러 부류의 개발자 분들이 계실 텐데요..

기껏해야 한두번 사용하는 건데..  하셔도 좋습니다. 하지만 언제 이 DTS와 함께

전쟁을 치루셔야 할지 모르니.. 한번쯔음~~ 자세히 보시는 것도 나쁘지 않겠지요?

^_^

 

DTS를 한마디로 말씀 드리자면?

이런 그림으로 표현이 됩니다.

반드시 하나 이상의 데이터를 가져올 데이터 원본 - Source가 필요하며 DTS엔진으로

SQL서버에 포함되어 있는 DTS엔진을 통해 하나 이상의 타겟 DATA에 전송되어야 합니다.

물론 여러개의 원본에서 데이터를 추출 / 적절한 가공 처리 / 여러개의 데이터 타겟

으로 전송 역시 가능하지요. 필수적인 것은 저렇게 붉은 색으로 처리된 것이며.

하나의 SQL서버에서 역시 데이터 소스 / 데이터 타겟 처리 가능하고

하나의 SQL서버 DB에서 역시나 테이블의 이름을 변경해 처리 역시 가능합니다.

중요한건 SQL서버가 중간에 포함되기만 하면 되며 오라클 <-> SQL서버 <-> 오라클

도 역시나 가능합니다.

 

여기서 잠시 DTS에 대한 여러 오해들을 알아 보도록 하지요.

DTS에 대한 오해들

1. SQL서버 끼리만 데이터 전송이 가능하다.

    - 데이터 소스에 대한 핸들러(ODBC, OLEDB Provider)만 있으면 가능합니다.

2. 다양한 데이터 핸들을 할 수 없다.

   - ODBC나 OLEDB가 접근만 가능하다면 모든 데이터를 핸들 가능합니다. 심지어는 

      TEXT화일까지도..

3. SQL서버의 데이터소스나 데이터 타겟에 없는 DB나 DBMS에 대해서는 DTS할 수 없다.

   - DBMS를 만들어 팔 정도의 회사는 프로그래밍 기술이 극한까지 올라가 있는 회사

      입니다. 또한 이기종과의 통합성을 '기본적으로' 제공하지 않으면 팔리지 않는것이

      요즘의 현실이지요. 당연히 대부분의 경우 ODBC, OLEDB Provider를 제공하며

      단지 모르기 때문에 저런 이야기가 나오는 것입니다. 각 업체에서 제공하는 이

      데이터 핸들러를 설치하고 다시 DTS의 데이터 소스나 타겟을 보시면? 해당하는

      제공자가 추가되어 있으며 DTS 처리가 가능합니다.

     추가적으로 ODBC나 OLEDB Provider는 MS에서 제창하고 그와 동시에 ADO나 그외

     프로그래밍에서 사용 되었습니다. 즉, 표준이 되어 버린 것이지요. 대부분의 어플들에서

     사용이 되며 손쉽고 빠르게 데이터 처리가 가능하기 때문에... 참고 하시길..

4. DTS는 재사용이 불가하다?

   - 설마요.. DTS는 패키지화 한후 자동화 작업인 Job에 등록후 재사용이 얼마든지 가능하며

     DTS패키지를 적절히 변환 다른 모듈을 붙일 수도 있으며 Job에 등록되기 때문에

     매일 / 매주 등의 스케쥴링 작업이 가능합니다.

     또한 이 DTS작업은 msdb의 sysdtspackage에 저장되며 이녀석을 이용 다른 서버에

     DTS패키지를 전송후 얼마든지 재사용이 가능합니다.

 

자... 그럼 DTS - 정확히는 MS의 데이터 핸들러가 어떤 데이터를 "기본적으로" 핸들 가능한지

알아 보도록 하지요.

간단합니다. 전부 적을거라 예상 하셨겠지만... -_-;;

이렇게..  DTS의 데이터 원본이나.. 데이터 소스 부분을 보시면 됩니다. -_-;;

뭐 좋습니다. 대단히 많습니다. 엑셀 / 엑세스 / 오라클 / DBase / 폭스 / SQL서버

등등이 있으며.. 텍스트 화일 역시 있습니다. ^_^

그렇다면.. 잘 사용은 하지만.. 이 리스트에 없는 녀석들은 어떻게 하는걸까요?

위에서 "기본적으로" 제공하는 녀석들에 대한 이야기만 말씀 드린 것이며..

"추가적으로" 범용적으로 국내에서 사용하는 몇몇 DB나 DBMS에 대한 글 역시

적어 보겠습니다.

 

1. MySQL 

이녀석은.. 최근 박훈님이 Friend's 강좌에 올려주신 MySQL Migration에

대한 글에서 쉽게 보실 수 있습니다. - 이자리를 빌어 박훈님께 감사 드립니다.

http://sqler.pe.kr/FriendLec/main.asp

부분의 진행된 강좌 부분에서 박훈님의 상세한 글을 보실 수 있으니 참고 하시구요.

MySQL ODBC를 이용하시면 되며 해당하는 글이 있으니 참고 하세요.

 

2. IBM DB2 

이녀석은.. 조금 난해 하실 수 있습니다.

가장 좋은 방법은 HIS서버(Host Integration Server)의 OLEDB Provider를 가져다가

사용하는 것입니다. HIS서버의 평가판은

http://microsoft.com/hiserver

에서 받으실 수 있으며 여기에 보시면? OLEDB 만 설치가 가능하니 이것을 이용하심이

좋습니다. HIS서버는 참고로 IBM 메인프레임과 연결 및 처리를 가능하게 하는 것으로..

메인 프레임의 ISAM / VSAM 데이터 역시 접근이 가능한 녀석입니다. 물론 DB2역시나..

이 녀석을 이용 DB2에 접근하실 수 있지요. 또는 CA400이라는 DB2용 클라이언트

툴 제작에 필요한 클라이언트인 이녀석에서 ODBC역시 구할 수 있다고 하니

참고 하세요.

 

3. Sybase 

이녀석은 쉽게 제공을 안해준다고 합니다. -_-;;

먼저 이녀석에 대한 ODBC를 구하시려면?  

Sybase에 정식으로 요청하는 방법과..파워빌더라는 개발툴에 

이 Sybase ODBC가 들어 있다고 합니다.

이녀석을 이용하시면 쉽게 Sybase용 ODBC를 설치가 가능하다고 하니 참고 하세요.

저역시 Sybase는 사용해 보지 않아서 모라 말씀 드리기 힘들군요.

확답을 가지신 분이 계시다면? 팁 게시판에 올려 주시거나..   

저에게 메일 주시면.. 등록하도록 하겠습니다.

 

5. Infomix 

이녀석은 특이하게도.. ODBC를 제공해 주지 않는다고 합니다. -_-;;

오로지 개발자에게만 ODBC를 제공 하며 라이센스를 구입해야 한다고 하네요.

역시나 파워빌더에는 이 인포믹스용 ODBC가 포함되어 있으며 적절히 추출(?) -_-;;

하시면 된다고 합니다. 참고 하시길 바랍니다. - 정보 주신 라라님 감사합니다.

 

이정도면 종종 사용하는 DB에 대한 소개는 해드린듯 하네요.

각각의 DB에 대한 버젼 / ODBC나 OLEDB의 버젼이 틀리다면 잘 안될 수 있으며

해당하는 문서들은 자신이 맞게 찾아서 해결 하셔야 할 것입니다.

 

ODBC와 OLEDB ?

ODBC는 Open DataBase Conectivity의 약자로 범용적인 데이터 접근을 위한 것입니다.

OLEDB역시 비슷하지요.

두개의 가장 큰 차이점을 말씀 드리자면? OLEDB는 훨씬 더 범용적입니다.

ODBC가 강형의(Strong) 2차원 테이블형의 정적인 데이터를 요구하는 반면..

OLEDB는? 좀더 느슨(Loosely Coupled)하며 좀더 범용적으로 

예를들면 텍스트 화일 / E-Mail등역시 데이터 원본으로 처리할 수 있지요. 

- 속도적인 측면으로 볼때 역시 OLEDB가 느릴것 같지만? 더 빠릅니다. -_-; 

또한 개발작업을 수행할 경우에 이용 역시 이 OLEDB가 간편합니다.

그외 UDL화일 생성 / 재사용을 위한 연결 등은 이 DTS에서 벗어나는 듯 하니.. 

넘어 가도록 하겠습니다. - 물론 UDL화일로 DTS역시 가능합니다.

 

그리고.. 남들이 잘 안하는 이야기로.. -_-;;

SQL서버끼리는 - 정확히 SQL2000 <-> SQL2000 또는 SQL7 <-> SQL2000 또는 SQL7 <-> SQL7

이녀석들은.. Transfer(데이터베이스간 개체 및 데이터 복사)가 가능합니다.

즉, 데이터 뿐 아니라.. 데이터베이스의 여러 개체들인 기본키, 참조키, 저장 프로시져

등등의 여러 개체들을 다른 SQL서버로 전송이 가능하다는 것이지요.

하지만 잘 모르시는 분들 - 처음 호스팅을 받으시거나.. 하시는 분들은 어려울 수 있습니다.

이때 생기는 여러 문제들의 해결 방안 역시 말씀 드릴 것이니 참고 하시길 바라구요.

 

참고로 SQL서버의 DTS에 대한 온라인 도움말 역시 많이 봐 보시길 바랍니다.

여러가지 발생 가능한 문제 - LOB데이터 처리 등.. 에 대한 글들 역시 참조 하실

수 있으니 도움 되시길 바랍니다.

 

자 그럼 다음으로..

이 DTS작업간의 여러 샘플들을 알아 보도록 하겠습니다.

****************************************************************************

2. DTS 위져드 사용

 

DTS를 손쉽게 해주는 툴이 있습니다.

정확히는 DTS 위져드로 마법사 기능이지요.

간단히 원본 / 타겟을 설정해서 처리하면 되며 처음 접하시는 분들도 손쉽게

처리가 가능하도록 되어 있습니다.

 

DTS작업은 크게 3가지로 나뉘어 집니다.

1. 원본 데이터베이스에서 테이블 및 뷰 복사 - 보통 Copy Data 라고 합니다.

말그대로 데이터베이스의 여러 개체들을 포함하는 정보를 SQL서버에 가져가는

것이 아닌.. 테이블의 틀 / 테이블의 데이터만을 복사한다고 보시면 됩니다.

기본키 , 참조키 , 저장 프로시져 등은 넘길 수 없습니다.

 

2. 쿼리를 사용하여 전송할 데이터 지정

DTS작업에 대한 약간의 유동성을 부여하는 것으로 이 작업은..

OpenRowSet이라고 하는 쿼리로 작동됩니다.

OpenRowSet은 이런 식으로 사용됩니다.

 

--SQL서버에 연결 샘플
USE pubs
GO
SELECT a.*
FROM OPENROWSET('SQLOLEDB','seattle1';'sa';'MyPass',
'SELECT * FROM pubs.dbo.authors ORDER BY au_lname, au_fname') AS a
GO

--엑세스DB에 연결하는 샘플
USE pubs
GO
SELECT a.*
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
'c:\MSOffice\Access\Samples\northwind.mdb';'admin';'mypwd', Orders) 
AS a
GO

--OpenRowSet의 데이터와 DB의 데이터 조인 작업
USE pubs
GO
SELECT c.*, o.*
FROM Northwind.dbo.Customers AS c INNER JOIN 
OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
'c:\MSOffice\Access\Samples\northwind.mdb';'admin';'mypwd', Orders) 
AS o
ON c.CustomerID = o.CustomerID 
GO

 

이런 식으로 작업이 되며 보시는 바와 같이.. From 절의 테이블이 들어갈 자리를

인라인 뷰처럼 대신 합니다. 모 좋습니다.

From 절에는 반드시 테이블이 들어갈 필요 없이 저렇게 2차원 배열형 데이터만 있으면

되지요. 이렇게 연결후..만약 from 절 앞에 into 서버명.DB명.dbo.새로운테이블명

하시면? 네. 바로 SELECT INTO에 의한 테이블 복사가 가능하고..

이 컬럼에 적절한 변환 함수를 적용할 수도 있지요.

이것이 쿼리를 이용한 전송의 기본이며.. 사실 그다지 사용할 일은 많지 않을 것입니다.

사용해 보신 분이라면? 대부분 데이터 복사(첫번째 옵션)에 역시나 "변환" 옵션이

있기 때문에 이부분을 이용 하시거나.. DTS패키지로 생성후 적절한 프로그래밍

로직을 추가 하셨을 겁니다. 다음 트랜스퍼를 이야기 드리지요.

 

3. SQL서버 데이터베이스간 개체 및 데이터 복사

보시는 바와 같이 SQL서버 끼리만 가능합니다. 옵션 사항은 복잡한듯 하지만..

사실 "전송"이 목적이라면 거의 건드리실 필요는 없으실 거구요.

호스팅을 받거나 IDC의 서버로 전송을 주로 하시는 분들은 종종 이녀석으로 데이터를

전송하거나 전송 받으실 겁니다.

중요한 것은 DB의 모든 개체를 복사한다는 것이구요.

테이블과 관련된 모든 개체인 데이터, 기본키, 참조키, 인덱스, 그리고 

저장 프로시져, 뷰, 사용자와 역할, 규칙, 기본값, 사용자 정의 데이터형과

사용자 정의 함수등 을 전송이 가능하며 이 두가지인 데이터베이스 다이어그램 / 

풀텍스트인덱스 데이터는 이 데이터베이스 개체만 트랜스퍼의 방법으로는 불가 합니다. 

그렇다고 해서 복사 안한다면 재미 없지요. -_-;

방법은 이장이 끝날때 쯤 말씀을 드릴 거구요..

이 전송을 아무래도 주로 사용하게 될테니.. 설명 드릴 겁니다.

 

그럼 찬찬히 진행해 보도록 하지요.

1. 원본 데이터베이스에서 테이블 및 뷰 복사 

간단합니다. 여러 제약등을 복사하는 것이 아니기 때문에 큰 무리없이 잘 수행되구요.

저는 간단히 엑세스에서 데이터를 가져와 보겠습니다. 여기서 중요한건..

엑세스를 가져온다는게 아닙니다. -_-;;  엑셀이건.. SQL서버의 데이터이건

다 처리할 수 있다는 것이지요. - OLEDB나 ODBC가 존재 한다면 말입니다.!!!!

그리고 가끔 올라오는 질문으로.. 엑세스 아이콘의 데이터 소스가 없다..

라는 질문이 올라 오는데요.. 간단합니다. 엑세스를 설치 하셔야만 물론

해당하는 제공자가 시스템에 등록되는 것입니다. 엑세스를 설치 하시면 됩니다.

엑셀이 없다면? -_- 물론 엑셀을 설치 하시면 되지요. DTS엔진이 있는 곳에만

설치 하시면 되며 당연히 소스 서버나 목적 서버에는 없어도 됩니다.

 - DTS엔진이 있는 곳이라는게 이해가 안되시면... 바로 앞에서 보신..

   꼬옥 1. DBMS간 데이터 전송에 대한 이해에 대한 글을 다시 읽어 보세요.

 

그럼 DTS를 시작해 보지요.

데이터 확인을 해 보겠습니다. 원본 화일을 열어보니?

FPNWIND.mdb 화일이라는 mdb 화일을 열어보니..

대충 이런식의 테이블로 구성되어 있으며 각 테이블에 여러 데이터와

기본키같은 개체들이 포함되어 있습니다. 전송을 시작해 보도록 하지요.

 

이러한 FPNWIND라는 데이터베이스를 생성 했으며 모든작업 -> 데이터 가져오기

를 선택 했습니다. - 여기서.. 가져오기를 하면? 데이터 타겟은 선택한 DB가 

자동으로 선택되는 것이며 내보내기를 하면? 소스 데이터가 자동으로 선택한 DB가

되는 것일 뿐입니다. DTS 위져드 진행중 바꾸셔도 무관하니 참고 하세요.

추가적으로 DTS위져드를 수행하는 방법은 가지가지 입니다. 저는 필요시마다..

DB에서 데이터 전송을 선택하는 것을 선호하며 하시던 방식이 있다면 편하게 사용하셔도

무관합니다.

 

계획에 MDB화일을 저의 SQL서버로 가져오기로 했습니다.

이렇게 데이터 원본을 엑세스로 잡았습니다.

- 누차 말씀 드리지만.. 데이터 원본을 적절하게 잡기만 하면 되는 겁니다.

 

타겟은? 당연히 저의 SQL서버 겠지요.

이렇게 대상 선택 부분은 당연히 SQL서버 대상에 적절한 서버의 이름과..

인증 방식 - 현재 저는 Windows인증이 된 상태(로컬 서버기 때문) 그리고 데이터베이스

를 적절히 생성 했습니다. 당연히 제 시스템이 아닌 다른 시스템에 하실 수 있으며..

인증이 적절히 수행되었는가 안되었는가는 데이터베이스 리스트박스를 눌렀을때

데이터베이스 이름들이 안나오면 인증이 적절하지 않은 것입니다.

또한 여기서 데이터베이스 이름들이 나왔다고 해서 DTS를 완전히 수행할 권한을

받은 것은 아니며 정확한 권한은 소스 / 타겟서버에 어떤 권한으로 접근 하는지를

정확히 파악하고 있어야 합니다. - 특히 호스팅일 경우 더더욱 주의해야 합니다.!!!

 

다음을 눌러서 테이블 복사 / 쿼리 지정을 보겠습니다.

보시면 이런 화면으로.. 엑세스 -> SQL서버로 작업이 진행되는 것을 보실 수 

있으며 복사 옵션과 쿼리 옵션이 활성화 되어 있습니다.

세번째 옵션인 SQL서버간 개체 / 데이터 복사는 당연히 SQL서버 끼리만 되니 활성화

안된 것이지요. 첫번째 복사 옵션으로 진행 하겠습니다.

 

이렇게 선택하는 부분이 나옵니다. 모두 선택 버튼을 눌러 모든 테이블 / 뷰를

전송할 예정입니다. 여기서 변환 이라는 부분이 있습니다.

고객 테이블에 대한 변환을 눌러 보면?

 

대강 이런 화면이 나오며 여기서 적절하게 컬럼의 데이터 형을 변환하거나..

NULL허용 여부, 대상(SQL서버)의 테이블 이름변경, 컬럼의 크기 등을 적절히

변환이 가능하며.. Identity Insert 옵션을 지정할 수 도 있습니다.

SQL편집 버튼을 누르면 

이런 식의 테이블 생성 스크립트를 볼 수 있으며 변환 탭을 선택하시면?

이렇게 열의 매칭에 대한 변환을 수행할 수 있습니다.

적절한 함수를 아래 보이는 언어 탭에서 VB스크립 / J스크립중 선택해 변환 함수를

사용이 물론 가능합니다. 

개인적으로 선호하는 변환 방식을 말씀 드리면..

저는 무조건 SQL서버로 보낸후 변환 시키기를 좋아 합니다. -_-;;

물론 일회성 작업일 경우는 대부분 SQL서버로 보내고 처리하며..

SQL서버에서.. 테이블 디자인을 바꾸거나.. 컬럼을 바꾸거나..

데이터 변환 역시 VB스크립에서 보다는 T-SQL의 함수로 쓰는게 저는 편해서 이렇게

씁니다. VB스크립 / J스크립중 편한게 있다면? 그것을 사용하셔도 물론 좋지요.

지금 저의 목적은 오로지 데이터만을 전송하는 것이니 다음을 눌러 진행하겠습니다.

 

그리고 이런 화면에서.. 즉시 실행을 할 것인지..

나중에 작업을 걸어 수행하게 할 것인지.. DTS패키지로 저장할 것인지의 옵션이

있지만 여기서는 속편하게 즉시 실행만 해 보겠습니다.

 

마침을 이렇게 누르면 전송이 완료가 되는 것을 보실 수 있을 것입니다.

작업이 완료 되었으면.. SQL서버에 데이터가 잘 넘어 왔는지 확인해 보도록 하지요.

보시면 이렇게 테이블과 데이터는 잘 넘어 왔으나..

데이터형 / 길이 / NULL여부 등등의 여러 조건들은 수작업으로 매칭해 주시면

됩니다.

 

간단히 엑세스로 수행해 보았습니다.

만약 소스가 SQL서버이고 타겟이 엑세스 화일이라면?

역시나 소스에서 적절한 SQL서버 연결과 DB를 잡고.. 타겟에서 빈 엑세스 화일을

생성후 해당하는 화일에 DTS하시면 되겠지요.

 

이번에는 SQL서버 -> SQL서버 작업을 해 보겠습니다.

northwind2라는 빈 데이터베이스를 생성하고 이곳에 nothwind 데이터베이스의

테이블들을 복사해 보겠습니다.

 

이렇게 Northwind2 데이터베이스를 생생후 northwind2데이터베이스에서 가져오기를

수행하겠습니다.

 

데이터 원본은 이럴 것입니다.

이렇게 데이터베이스가 Northwind 데이터베이스일 것이고

 

뒤에서 타겟은? Northwind2 데이터베이스겠지요.

방식을 지정하는 부분에서 세번째 SQL서버간 개체/ 데이터 복사가 활성화

됩니다만.. 저희는 한번더 테스트를 위해 첫번째 테이블 복사를 해 보지요.

 

다음화면에서 전송할 테이블은? 모두 선택을 눌러 모든 테이블 / 뷰를 선택합니다.

주의 하셔야 합니다. - 아래쪽으로 스크롤해 보시면?

Northwind의 뷰가 어떻게 전송이 되나요?

네. 뷰 -> 테이블로 변환 됩니다. 어거지로 복사한다는 느낌이 강하지요.

여하간 다음을 누르고 즉시 실행을 하시면 데이터는 잘 넘어 갈 것입니다.

그리고 northwind2 데이터베이스의 테이블등을 조사해 보시면?

이렇게 기본키제약이나.. 참조키 등등의 제약들이 전송 안된것을 보실 수 있습니다.

 

이제는 모든 데이터베이스 개체를 전송하기 위한 SQL서버간 개체 / 데이터 전송을

해 보겠습니다. 두번째 방식인 쿼리를 이용한 복사는 많이 안쓰시게 되기 때문에..

다루지 않을 것입니다.

 

자 Northwind3라는 빈 데이터베이스를 생성 했습니다.

데이터 원본은 Northwind 데이터베이스이며 타겟은? Northwind3 데이터베이스

입니다.

그리고 작업을 수행 하는데요..

이렇게 세번째 옵션인 SQL서버간 개체 / 데이터 복사를 택합니다.

 

이렇게 복사할 개체 선택 부분이 나오며 

대상개체를 먼저 삭제할 것인지, 종속개체를 포함할 것인지 그리고 약간 의아하실

확장 속성의 의미는.. 컬럼의 주석 같은 것으로..

이렇게 컬럼의 설명 부분의 주석 같은 것 역시 복사하는 것을 의미 합니다.

자세한 정보를 원하시면?

이곳의 팁게시판 정보

를 보시면 확장 속성의 저장소에 대해 좀더 도움 되실 겁니다.

다음으로 데이터를 바꿀 것인지.. 추가할 것인지를 선택 하시면 되며..

이렇게 모든 개체 선택의 체크를 제거후 개체선택 버튼을 보면 모든 개체에 대한

처리가 가능하다는 것을 알 수 있습니다.

취소 하시고 모든개체 복사의 체크박스를 다시 체크 되게 하신후..

기본옵션 사용의 체크를 제거한후 옵션 - 버튼을 누릅니다.

이러한 화면을 보실 수 있으며..

가장 문제가 되는 보안 옵션 부분입니다.

양쪽 서버 모두에 SA계정과 같은 System Admin 그룹에 속한 사용자로 접근을 하더라도

이 두개의 체크되어 있는 옵션인 데이터베이스 사용자 및 역할 복사와

개체 수준 사용 권한 복사 두개의 체크를 제거하심이 완전한 복사에 좋습니다.

 

이 두 옵션을 제거하라고 말씀 드리는 이유는.. 대부분의 개발 작업은?

자신의 시스템에서 SA계정과 같은 사용자로 작업 합니다.

그리고나서 IDC나 호스팅 하는 곳에 전송을 하는데..

타겟측에서 DB 권한이나 개체 수준 사용권한을 적절하게 처리 못하는 경우가 많습니다.

물론 로컬 시스템에서 테스트 시는 당연히 권한 / 계정에 대한 처리가 필요 없지요.

같으니까요. 하지만 원격지.. 특히나.. 호스팅일 경우는?

예를들어 호스팅 서버는 sa계정을 받지 못하며 대부분 dbo권한 - DB소유자 권한

정도만을 받게 됩니다. 뭐 나쁘다는 것은 아닙니다. 이럴 때 서버측의 데이터를 자신의

시스템으로 전송 받고 싶습니다.

이때.. 서버측에 받은 계정이 자신의 로컬 시스템에 있습니까?

없다면? 계정이 없다는 오류를 만나실 겁니다.

계정이 있더라도 권한등의 충돌이 날 오류가 많습니다.

그럼 어떻게 하는가? 호스팅 받는 원격 서버의 데이터를 가져오기 위해서는

자신의 시스템에 계정을 생성하고.. - 호스팅 업체로부터 받은 계정과 같은 계정

그리고나서 전송을 수행하시면 됩니다. 상세한 계정 생성은 마지막 강좌인

로그인 및 권한 부분에서 생성하고 처리하실 것이니 조금만 기다려 주시고..

 

이야기가 길어졌습니다만!!!!

그냥 속편하게.. 계정과 관련된 부분을 제거하고 넘기면 된다..

라는 정도만 생각하시고.. 

나머지는 기본 옵션으로 두시고.. 전송을 하시면 됩니다.

 

이때.. 이 작업을 저장해 보도록 하겠습니다. 어떻게?

이렇게 즉시 실행에 체크하고 이어서 DTS 패키지 저장을 해 보겠습니다.

이 DTS패키지라는 것은?

지금 선택하신 여러 옵션들에 대해서 - 데이터 원본, 데이터베이스,

전송 방식, 옵션등의 선택한 사항들을 저장하는 것입니다. SQL서버에 저장하지요.

 

코난이는 이렇게 이름 정도만 주고 작업을 수행했습니다.

작업을 수행하시면? 우선 잘 되는 것을 보실 것이며 

작업이 끝난후... 

확인해 보시면... 모든 기본키 / 참조키 등등의 데이터베이스 개체가

잘 전송 된것을 아실 겁니다.

또한 패키지 저장을 수행 했으니..  데이터변환 서비스 - 로컬 패키지 부분을 보시면?

이렇게 지금 수행한 작업의 흐름이 패키지화 되어서 저장되어 있는 것을

보실 수 있습니다.

이 작업을 매일 새벽 6시에 수행하려면?

이렇게 예약 부분에서 자동 수행이 될 시각및 반복 수행을 지정할 수 있습니다.

즉시 패키지를 수행하는 옵션도 있지요.

 

그럼 정리해 볼까요?

데이터 복사 옵션을 이용하면? 말그대로 테이블 / 뷰의 복사가 이루어 지지만..

기본키, 참조키, 저장 프로시져 등의 개체는 복사가 불가합니다.

세번째 옵션인 SQL서버간 전송은?

SQL서버 끼리만 가능하며 SQL7 <-> SQL2000역시 가능합니다만..

제약조건으로 개체의 사용 수준 권한 등의 보안 관련 옵션들 전송에 문제가 있을

수 있으며 또한 개체의 소유권 및 그 권한까지 그대로 전송하기 때문에

전송 받는 서버에 적절한 계정 / 권한이 설치 되어 있어야만 합니다.

IDC에 서버를 넣고 쓰신다면? SQL서버간 전송시 

1. 기본옵션 사용의 체크 제거

2. 데이터베이스 사용자 및 역할 복사 체크 제거

3. 개체 수준 사용 권한 복사 체크 제거를 하고 트랜스퍼

하시면 아주 잘 됩니다.

호스팅을 받는 분이라면?

1. 호스팅해주는 업체에서 주는 계정과 같은 내부 UID를 가지는 계정이 전송 받으려는

시스템에 존재 해야만 합니다.

uid의 확인은. 해당 테이블의 sysusers 테이블을 여시면 uid와 name을 보실 수 

있으며 해당 uid를 가지고 sysobjects 테이블을 열면 uid에 대한 DB개체를 볼 수 있습니다.

 

use 데이터베이스명
go

select 
        sysobjects.name
,       sysobjects.uid
,       sysusers.name 
from 
        sysobjects 
        inner join sysusers
            on sysobjects.uid = sysusers.uid
--테이블에 대한 것만 본다.
where 
        sysobjects.xtype = 'U'

 

이정도만 하도록 하구요...

트랜스퍼를 한번에 잘 되길 바란다면 욕심이 크신 겁니다.

저역시 여러번의 시행 착오를 거치고 수행하고.. 다시 만들고.. 합니다.

천천히 안된다고 포기 마시고.. DTS시 에러가 생기면 에러 메시지를 보여주니..

잘 읽어 보시고 문제를 해결후 다시 DTS를 수행하면 되겠지요.

 

호스팅을 받을 경우 트랜스퍼가 영 맘에 안드신다면?

이럴때는 좀더 속편하게 테이블 복사 DTS를 하시고.. 개체 스크립팅을 받으신후..

이 스크립팅 받은 SQL구문을 서버측에서 실행해 해당하는 개체를 생성하는

것도 나쁘지 않은 방법 입니다.

자.. 여기까지..

 

이제 언급해 드리기로한.. 데이터베이스 다이어그램 전송과

풀텍스트 데이터 전송에 대해서 말씀 드리지요.

다이어그램 전송은? -_-;;  그냥 트랜스퍼 하고 옴겨진 곳에서 다시 생성하시면

되겠지만.. 명색이 SQLER인데. -_-;;;

말씀 드려야 겠지요. ^_^;;;

약간 까다로울 수 있습니다.

1. 시스템 테이블을 수정할 수 있게 한다.

2. 'dtproperties' 라는 다이어그램 정보를 가지고 있는 시스템 테이블을 사용자 테이블

속성으로 변경한다.

3. dtproperties 테이블에 Identity Insert 속성을 ON 시킨다.

4. INSERT SELECT로 dtproperties 테이블의 데이터를 복사한다.

5. dtproperties 테이블을 다시 시스템 테이블로 변경한다.

6. 시스템 테이블 수정을 불가하게 한다. 입니다.

 

당연히 모르셔도 되는거니 넘어가셔도 상관 없습니다. -_-;;

자 진행해 보도록 하지요.

 

--pubs DB에 다이어그램 생성 했습니다.

use pubs
go

--다이어 그램 생성시 생기는 시스템 테이블
select * from dtproperties


--시스템 테이블에 수정을 가능하게 한다.
EXEC sp_configure 'allow updates', 1
RECONFIGURE WITH OVERRIDE
GO

--dtproperties 테이블을 사용자 테이블 속성으로 변경한다.
--당연히 복사할 데이터베이스나 다른 시스템의 데이터베이스에서 수행한다.
--본인의 경우는 pubs DB의 다이어그램을 Northwind에서 수행하려 하는 것이다.

use northwind
go


UPDATE sysobjects
SET xtype = 'U'
WHERE name = 'dtproperties'

--IDENTITY_INSERT 옵션을 ON 시킨다.
SET IDENTITY_INSERT dtproperties ON

--pubs의 id와 겹치면 안되므로.. 이렇게 id + 10000을 준다.
INSERT INTO dtproperties(id, objectid, property, value, lvalue, version)
SELECT id + 10000 as id, objectid, property, value, lvalue, version 
FROM pubs.dbo.dtproperties


--다시 테이블의 속성을 시스템 테이블로 변경한다.
UPDATE sysobjects
SET xtype = 'S'
WHERE name = 'dtproperties'



--시스템 테이블에 수정을 불가하게 한다.
EXEC sp_configure 'allow updates', 0
RECONFIGURE WITH OVERRIDE
GO


--이어서 Northwind Database의 다이어 그램에서 리프레시 해보면?

느끼시는 것처럼.. 쓰잘데기 없는데에 목숨건다고 생각하실지도.. -_-;;

이 내용은..

작성자 : Brian Knight

출처 : http://www.sqlservercentral.com

부분의 내용이기도 하답니다. 참고 하시길 바랍니다.

 

다음으로 풀텍스트 데이터 처리르 하려면?

멀리 가실 필요 없습니다. 거북엄마님이 이미 정리해 주신 내용이 있지요.

http://sqler.pe.kr/FriendLec/TurtleMa/LecM/mq16.asp

을 참고 하시면 도움 되실 겁니다. ^_^

 

위에서 만든 DTS패키지가 있는데요.. 이녀석을 전송하고 싶을때는?

이녀석은 또한 특이합니다.

출처 : swynk.com

작성자 : Darren Green

SQLER의 팁게시판 참고

역시나 설명을 자세히 드리고 싶지만.. 필요하시다면?

이곳을 이용하시면 되실 겁니다.

 

자 여기까지~~~~ ^_^  이 내용들은 그다지~~ 신경 안쓰셔도 물론 되겠지요? ^_^

 

 

그렇다면 여기서 DTS작업들의 보완하고 싶은 점을 생각해 보지요.

1. 매일매일 원격 서버측의 데이터를 우리 회사의 데이터 복사 용도의 DB로 옮겨

오고 싶습니다. DB이름이 SQLER라고 원격 서버에 되어 있으며..

매일매일 가져와서.. SQLER20011230 식으로.. 년월일을 포함해 가져오고 싶습니다.

트랜스퍼를 매일 매일 하기도 힘든데.. 자동으로 할 순 없는 것인지?

또한 전송이 완료되면 완료 메시지를 메일로 받거나..

실패하면 실패라는 메시지를 바로 메일로 받을 수 는 없을지요?

 

2. 하루에 SQL서버에 로드해야할 데이터가 1000만건입니다.

저희는 사용자의 클릭 데이터까지 저장 하므로.. 1000만건의 데이터가 넘는

정보를 옮겨야 하는데.. 앞으로 서버가 늘어날 예정이어서 수억건이 될지도 모릅니다.

DTS로 해보니 속도가 많이 느려 새벽에 작업을 수행해 데이터를 삽입시 

오전이 될때까지 계속 수행이 됩니다. 조금더 빠르게 수행할 수는 없는 것인지요?

 

1번의 답변으로는 DTS 패키지를 생성하시면 됩니다. 바로 다음에 설명드릴

DTS패키지 생성 부분에서 전역변수를 이용한 DTS패키지 샘플을 생성해 보실 거구요.

2번의 답변으로는 BCP와 Bulk Insert 입니다.

벌크 작업으로 특정 옵션을 적절하게 줄 경우 최적의 속도로 데이터를 전송할

수 있지요.

찬찬히.. 위 두가지 내용을 각각 알아 보도록 하겠습니다.

먼저 DTS패키지 입니다.

****************************************************************************

3. DTS 디자이너 사용

 

DTS를 조금더 확장시켜 프로그래밍 가능한 DTS패키지를 생성하자는 것입니다.

사실 DTS라는 녀석이 종종 수행하는 녀석이고..

잘 안다고 생각하시는 분들 이라도.. 이 프로그래밍 기능이나 특수한 여러 옵션들을

적절하게 수행하는 분들은 많지 않습니다.

이미 wrox출판사에서 책한권 분량으로 나와 있지요.

저는 구입은 못하고 어깨 너머로 맛만 보았습니다만... T.T

http://www.amazon.com/exec/obidos/search-handle-form/107-7024388-4700558

부분에서 여러 DTS 책들을 보실 수 있습니다. - 아마존의 경로이니 변경될 수 있습니다.

그만큼 내용이 많은게 바로 DTS라는 녀석이며 많은 분들은 오로지..

맛만 보시는 것이지요 -_-;;  저역시 상세한 많은 내용은 설명 드리기 힘들겠으며..

주요한 프로세스만 엮어서 생성후 보여 드릴 것입니다.

먼저 생성하기 전에.. DTS 디자이너라는 녀석에 대해서 알아 보도록 하지요.

이렇게 데이터 변환 서비스 하위의 로컬 패키지 부분에서 바우스 우버튼

새패키지를 하시면 되며.. 바로 앞에서 DTS 위져드에서 패키지 저장을 체크하고 

패키지를 만드셨다면? 만들어진 패키지도 보일 겁니다.

패키지를 열려면 해당 패키지를 열면 되고...  새 패키지를 만들려면? 저렇게 하면 됩니다.

새 패키지를 여셨으면? 저러한.. 허연 화면에 뭔가 눌러야 할게 대단히 많은 -_-;;

암울한 상황이 벌어집니다. 화이팅을 한번 외치고 설명에 들어가 보겠습니다.

-_-;;

DTS패키지 작업은 크게 네부분 입니다.

패키지에 대한 저장, 주석을 달기 위한 메뉴인 패키지 메뉴

데이터 소스나 데이터 타겟에 연결하는 부분을 정의하는 연결 메뉴

작업 내역이 SQL서버간 개체 전송인지 SQL구문을 이용한 작업인지.. 특수한 변환

작업인지를 정의해주는 작업 메뉴

그리고 A라는 작업이 성공이면 A-Success 로 가라.. 라던가 실패면 A-Fail로

가라고 정의할 수 있는 워크플로 메뉴 가 있습니다.

 

다닥다닥 붙어있는 아이콘은 각각의 메뉴에 대한 녀석들이니 참고만 하세요.

패키지 메뉴의 내역들인

녀석들은 어떤 녀석들인지 감이 오실 것입니다.

테스트 주석 추가나.. 저장 정도만 이해 하시면 되지요.

 

중요한 이야기를 시작해 보겠습니다.

데이터 연결에 대한 부분

SQL서버.. 엑세스.. 등등과.. Microsoft Data Link인 UDL화일을 이용한 연결 역시

있습니다. 설명드린대로.. 이녀석을 가지고 데이터 소스나 데이터 타겟에

연결을 지정해 주셔야 합니다. - 당연히 중요한 내역이며..

 

DTS작업

다음 작업 부분을 봐 보시면?

이러한 내용으로 대단히 많은 작업 내역인.. 예를들면.. 특수한 변환 작업을 위한

ActiceX스크립트 작업 - VB의 모듈과 같습니다.

SQL실행 작업 - SQL쿼리를 이용한 몇몇 작업

SQL Server 개체 복사 작업 - SQL서버간 개체 전송 작업

등등.. 여러가지 작업들이 있습니다.

 

DTS 워크 플로

끝으로 이렇게 워크 플로는 완료시, 성공시, 실패시의 세가지가 있으며

간단히 어떨때 어떤 작업으로 가라고 정의가 되는 것이지요.

 

이정도가 저의 설명이며...

이 녀석들을 가지고 우리의 패키지를 생성한다면?

1. 연결을 만들어 데이터 소스 / 데이터 타겟에 연결한다.

2. 작업을 정의해 여러가지 데이터 소스에 대해 변환 / 필요 작업을 적절하게 

여러가지 작업 항목을 가지고 처리한후

3. 성공시 어떤 작업을 하며 실패시 어떤 작업을 하게하는 워크 플로를 지정

처리를 진행하게 하고

4. 여기서는 성공시 데이터 타겟에 데이터를 보내는 작업이 되며 성공 완료 메시지를

관리자에게 전달

5. 실패하더라도 실패 메시지를 관리자에게 보내면 된다.

 

대강 이런 흐름으로 생성하면 된다는게 느껴질 것입니다.

자. 그럼 우리의 목표를 다시한번 알아 볼까요?

목표 : 원격지의 SQL서버에 연결하고 SQL서버간 전송작업으로 데이터베이스의

모든 내용을 로컬 서버로 가져오는데.. 이 작업은 매일 수행되어야 하며

DB이름을 History유지를 위해.. Pubs20011231식의 년월일을 포함한 DB명으로

생성을 해야 하고 이곳에 데이터를 넣어야 한다. 작업이 실패하면 실패라는 

메일을 받고 성공이라면 성공 메일을 관리자가 받아야 한다.

 

조금더 분산시켜 개발자의 시각인 일명 "개눈깔"을 이용해 DTS패키지적으로 생각해 본다면?

1. 연결은 원격서버 / 로컬서버 두군데가 필요하다.

2. DB이름을 적절히 그날의 날짜로 생성해야 하며

3. 어려울듯한 작업으로 바로 위에서 생성한 DB에 데이터를 부어야 하고

4. 작업을 모두 완료하면 워크 플로를 적절히 이용 성공시 / 실패시 분기를 두어

각 작업에 맞도록 메일을 보내면 될듯 하다.

 

자. 이렇게 생각이 가능할 것입니다. 그렇다면.. - 아직 감이 잘 안오시겠지만..

예상되는 문제점을 나열해 보겠습니다.

2와 3번의 DB생성은 CREATE Database 로 하면 될듯 한데... 어떻게

SQLER20011230과 같은 DB이름을 전송해 줄 수 있을까? 라는 문제입니다.

전혀 다른 항목간에 저 이름을 전송해야 하는데.. 어떻게 하면 될 것인가?

- DTS 디자인에서 동적 속성 작업을 줄 수 있으며 여기서 전역변수를 적절히 이용

할 수 있습니다.

4번의 문제로.. 메일을 보낸다는 것인데.. SQLMail은 여러가지 셋업이 귀찮으며..

정확히 동작하는데 약간의 무리가 있을 수 있고...

도메인에 익스챈지 서버가 있어야만 가능한데.. 이걸 어쩌면 좋을지...

- SQLMail만이 메일을 보낼 수 있는 것은 아니며.. 여기서는 저장 프로시져로 메일을

보내는 녀석을 DTS엔진이 수행되는 로컬 시스템 MasterDB에 등록후 성공시

및 실패시 각각의 메일 전송 작업을 Windows2000이나 WinNT4의 SMTP 서비스를 이용

CDO를 이용한 메일 전송을 수행할 예정이니 이 녀석을 이용하면 된다.

이 내용은.. 이곳 SQLER Tip 게시판을 참고하자.

 

자.. 이렇게 계획을 세웠다면?

이제 작업을 진행해 보도록 하겠습니다.

 

다음 DTS패키지 생성과 실행 부분을 해 보도록 하지요

****************************************************************************

4. DTS 패키지 생성과 실행

 

자 수행 계획이 되었으니 이제 작업을 진행하겠습니다.

 

연결을 생성하겠습니다.

연결은 원격 SQL서버, 데이터를 넣은 로컬 SQL서버 두개가 될 겁니다.

이렇게 연결을 당연히 둘다 SQL서버이니 Microsoft OLE DB Provider For SQL Server

를 선택합니다.

원격지 서버는 위처럼 적절하게...

연결 이름을 Remote SQL Server라고 지정했으며..

원격지의 KONAN이라는 서버에 접근하기 위해.. 저렇게 주었으며..

저의 경우 인증 방식은 NT인증으로.. 또한 DB는 pubs를 로컬 시스템으로 전송하기 위한

녀석으로 잡았습니다. - 자신에게 맞게 적절히 변환 하세요.

 

데이터를 가져올 로컬 서버 역시 이렇게.. 잡았습니다.

이름은 Local SQL Server로.. 인증 방식 적절하게.. 그리고 DB의 경우는?

매일매일 해당하는 DB가 바뀌는 수행 방식을 하기로 했죠?

그래서 저는 이렇게 Master DB를 잡았습니다.

 

이렇게 대충 허연 화면에 두개의 연결이 잡힌듯 합니다.

이제 다음 작업인..

로컬 시스템에 SQLER년월일  형식의 DB를 생성하고 여기에 부어야 합니다.

이거 쉬울것 같아도 어렵습니다. -SQL실행 작업을 선택합니다.

로컬 서버에 DB를 생성해야 할 것입니다.

그렇죠?

생성 하겠습니다.

 

use master

go

--테스트 조회
select convert(varchar(10), getdate(), 112)

--결과 
20011231


--DB를 생성하는 프로시져 생성
--drop proc CrtDayDB
create proc CrtDayDB
as
declare @sql varchar(300)
declare @v_YMD varchar(20)
set @v_YMD = (select convert(varchar(10), getdate(), 112))
set @sql = 'create database pubs' + @v_YMD 
exec (@sql)

--테스트 수행
exec CrtDayDB

--결과
CREATE DATABASE 프로세스에서 'pubs20011231' 디스크에 0.75MB를 할당하는 중입니다.
CREATE DATABASE 프로세스에서 'pubs20011231_log' 디스크에 0.49MB를 할당하는 중입니다.

 

네.. 이런 식의 저장 프로시져를 생성 했으며.. 지 저장프로시져는?

당연히 DTS엔진이 수행되는 로컬 시스템의 masterDB에 생성이 될 것입니다.

그러면?

저 프로시져를 돌리면? 항상 pubs년월일 식의 DB가 생성이 되겠지요.

그리고 이렇게.. 우리의 SQL작업인 데이터베이스 생성은?

간편하게 저러한 식의 SQL실행 작업이 될 것입니다.

보시면.. 연결에 주의!!!!  로컬 시스템에 DB가 생성 되어야 하지요?

또한 제한 시간 300초로.. 5분정도 수행하게 여유를 두었습니다.

SQL구문은.. 간편하게 프로시져를 수행만 하면?

DB가 자동으로 생성 되겠지요.

 

이제 약간 난해한 이야기가 나옵니다.

저 DB이름을 전역변수에 옮겨 동적 속성 작업과 함께 수행해

SQL서버간 개체 전송 작업에 전달을 해 줘야 한다는 것이지요.

먼저 전역변수에 저 DB이름을 담아 보겠습니다.

역시나 SQL작업을 하나 더 수행하며..

연결은 로컬 SQL서버에서 수행하게..

그리고 SQL구문은? 저렇게 pubs년월일의 결과가 나오게 수행합니다.

이 결과값을 전역변수로 보내는 것이지요.

 

매개변수 버튼을 누르고..

출력 매개 변수 탭을 선택합니다.

출력 배개 변수 탭에서..

이렇게 행값을 출력 매개 변수 유형으로 택하고...

이어서 전역변수 만들기 버튼을 누릅니다.

코난이의 경우 이렇게 이름을 gDBName으로.. 유형은 String으로..

주었으며.. 새로만들기 버튼을 누릅니다.

그리고나서..

이렇게.. 매개변수 매칭 부분에서.. 출력 전역 변수를 gDBName이라는...

지금 방금 생성한 전역변수에 리턴값 - 당연히 pubs년월일 값이지요.

이녀석을 매칭해 줍니다.

그러면 어떻게 되나요?

리턴값인 pubs20011231 값이? 네 맞습니다. DTS패키지 전체에서 사용 가능한

전역 변수가 된 것입니다. - 물론 매일매일 변화하겠지요.

이 SQL작업이 하는 일은 무었입니까?

하는 일은 오로지 한가지!!!!

DBName을 전역변수에 저장할 뿐이며.. 이 값 역시 매일매일 변화할 것입니다.!!!

 

이제 해야할 작업은..

SQL서버간 데이터 전송을 매칭해 주는 것입니다.

자 이렇게.. SQL Server 개체 복사 작업을 선택 합니다.

원격지 서버는? 저의 경우 KONAN이며..

인증방식은 저렇게 NT인증.. DB는 원격지 원본인 pubsDB입니다.

여러분의 경우 적절하게 바꿔 주시면 되지요.

다음 대상 탭입니다.

이곳에서.. 우리의 전송 목적은 어디입니까??????????

서버는 로컬.. 그리고 데이터베이스는?????

안타깝게도.. 우리의 데이터베이스는???

여기에 당연히 등록 안되고.. 특수한 무엇인가를 해줘야 합니다.

이곳 대상의 DB에 적절히 뭔가를 해 줘야 한다는 겁니다!!!!

그게 뭔가요????

네. DB명을 바로 gDBName이라는 전역변수에 담긴 이름으로 해 줘야 한다는 것이지요.

우선은!!!  신경 끄도록 하고. 이 전송작업을 완료 하셔야 하며..

이 로컬의 DB는 동적속성 작업으로 잠시후에 지정할 것입니다.

저는 우선적으로 이렇게 master로 잡았으며..

 

그리고 복사 탭에서는?

기본 옵션 사용의 체크만 제거하고..

옵션 버튼을 누른후.. 데이터베이스 사용자 및 데이터베이스 역할 복사 체크 제거

개체 수준 사용 권한 체크 제거를 하고

확인을 눌렀습니다. - 왜 저 두개의 체크를 제거하는지는 앞의 DTS강좌를 다시 봐

보시길...

 

자!!! 이제 문제의 작업인.!!!!

로컬 시스템의 타겟 DB를 전역변수로 바꿔치는 작업을 해 보겠습니다.

이렇게 동적 속성 작업을 추가합니다.

이어서.. 추가 버튼을 누른후..

이렇게 DTSTask_DTSTransferObjectsTask_1 작업의 DestinationDatabse가???

네.. 바로 타겟 데이터베이스이며.. 이곳의 DB는 조금전 위에서 설정한 masterDB로

되어 있지요!!! 이녀석을 우리의 전역변수로 바꿔 쳐 주는 것입니다.

해당하는 그리드 셀인 DestinationDatabase의 Master셀을 선택하고..

설정 버튼을 누릅니다.

그리고 이렇게..

원본은 전역변수!!! 또한 변수는??? 우리가 앞에서 생성한 gDBName을 선택해 주면

만사 OK가 되는 것이지요!!!

 

자. 이렇게. 확인을 누르면 확인 정보가 뜨며.. 마무리가 되었으니?

확인을 누르시면 됩니다.

 

자이제 무엇이 남았습니까?

네 맞습니다. 오류시 메일 발송, 성공시 메일 발송이 남았습니다.

말씀 드린대로.. 프로시져를 생성합니다.

메일 보내는 프로시져 생성 구문 - SQLER 팁게시판

에서 저장 프로시져를 생성하세요. 물론 프로시져는 DTS가 수행되는 로컬 시스템의

MasterDB에 생성하도록 하겠습니다.

그리고.. 테스트를 해 보세요.

 

use master

--실행하기
exec pSendMail '보내는 사람 멜 주소', '받을사람멜주소', '제목','내용'

 

이렇게 수행하시면 되며... - 당연히 자신에게 맞는 값으로 바꿔야 합니다.

주의하실 점으로.. 반드시 로컬 서버의 SMTP서비스가 활성화 되어 있어야만 합니다.

관리도구 -> 서비스 에서.. 항목 SMTP가 수행중인지 확인해 보셔야 하며..

설치를 안하셨다면? - Windows2000에서는 기본 설치 됩니다.- Windows2000 시디를 넣고 설치

하시면 잘 될 것입니다.

네.. 테스트가 잘 되었으며.. 이제 DTS패키지에서 SQL작업을 두개더 생성 하겠습니다.

이렇게 실패 작업이며.. DTS작업 실패라는 메시지가 전달되게 해 두었습니다.

 

이렇게 성공 작업 역시 하나 더 생성을 했습니다. ^_^

 

필요하다면? 적절하게 작업을 추가해.. DB생성 작업 실패.. 또는 다른 작업 실패..

등등을 하실 수도 있겠지요.

 

자 이제는 우리의 모든 작업이 완료 되었네요.

이제 워크 플로를 연결해 보겠습니다.

작업 워크 플로 연결은 이렇게 간단하며..

보시는 바와 같이 작업을 선택하고.. 

성공한 경우 / 실패한 경우를 택해 주시면 됩니다.

이렇게.. 실패시 작업과.. 성공시 작업을 연결 한다면?

1. DBName을 전역 변수에 담는다.

2. 로컬 시스템에 DB를 생성한다.

3. 동적 작업으로 타겟 DB를 전역변수로 설정한다.

4. 데이터를 전송한다.

5. 성공 메일을 보낸다.

이며.. 각 작업에 실패시 전송 실패 메일을 보내게 설정 했습니다.

저장 버튼을 눌러.. 지금 생성한 패키지를 SQL서버에 저장하며.. 저장 위치는?

당연히 로컬 시스템의 SQL서버가 되겠지요.

 

그리고나서...

이렇게.. 로컬 패키지 부분을 보시면? 지금 생성한 패키지가 있습니다.

또한 데이터베이스를 보시면 조금전 테스트로 생성한 DB가 있을 수 있으니 제거 하시고..

이렇게 패키지를 수행해 보면?

 

잘 수행되는 모습을 보실 수 있으며 또한 에러가 생긴다면? 에러 메시지가 리턴되니

에러를 보시고 무엇이 문제인지 확인하시면 되겠습니다.

또한 에러시 처리 부분을 적절하게 추가하신다면?

예를들어.. DB생성후 에러라면? 분기를 생성한 DB를 삭제하고 관리자에게 메일 발송 등의

적절한 작업을 추가할 수 있겠지요.

또한 저는 SQL서버에 대한 이야기를 해야 하기 때문에..

SQL작업을 많이 두었으나.. VB스크립에 강하시다면? VB쪽 처리 작업을 두실 수도 있습니다.

 

DTS작업에서 또한 재미있는.. FTP로 자동 접근후 화일을 가져와 처리하는 작업과..

그외 다양한 처리 작업이 많이 있는데요.. 자신의 목적에 맞게 적절한 처리를

공부하고 쓰신다면 거의 완벽에 가까운 DTS패키지를 생성 가능하실 겁니다.

특히나 OLAP데이터를 생성하기 위해 데이터 정제 과정에서 DTS를 종종 사용하시는

분들은.. 이 DTS하나만 잘 생성해 두시면 데이터 정제과정을 신경쓸 필요가 없게되니

참고 하시길 바랍니다.

 

끝으로 이 DTS패키지의 스케쥴을 걸어 보도록 하겠습니다.

당연히 SQL서버의 자동화 작업과 관련된 SQLServer Agent 프로세스가 활성화 되어 있어야

하며.. 패키지 예약을 수행합니다.

이렇게.. 하루 한번 매일 수행하게 했으며 오전 5시 5분에 수행하게 설정 했습니다.

그러면 관리자는 이 스케쥴 실행 여부를 조사하면 되겠지요. 또한 실패시 / 성공시

메일을 받게 될 것이구요. SQL Agent의 동작여부를 잘 확인 하셔야 하니 참고 하시길 바라구요.

 

비교적 간단한 DTS디자인 샘플 하나를 알아 보았습니다.

처음에도 말씀 드렸지만.. 말그대로 맛뵈기 DTS패키지인 것입니다.

더 다양한 처리를 원하신다면.. 온라인 도움말의 DTS부분을 참고해 보시고..

책으로 나온 DTS이야기 역시 많이 있으니 참고해 보시길 바랍니다.

 

다음으로 BCP와 Bulk Insert에 대해서 알아 보도록 하겠습니다. ^_^

******************************************************************************

5. BCP와 BULK INSERT를 사용한 데이터 전송

 

네.. 이렇게 다양한 처리가 가능한 DTS 디자인에 대한 부분을 알아 보았습니다.

DTS는 이렇게 다양한 처리가 가능합니다만..

 

허벌나게 많은 데이터에 대한 처리는 문제가 많을 수 있습니다.

예를들어 수천만건의 데이터를 오늘중으로 옮겨서 처리해야 한다면?

편의성 / 프로그래밍 기능 보다는? 속도와의 싸움이 될 것입니다.

 

테스트로 한 10만건 정도의 데이터를 가지고.. 이리저리.. DTS로도 해보고..

SELECT INTO나.. OpenRowSet등의 방법으로 데이터도 옮겨보고..

가장 빠른 속도를 얻을 수 있는 방법을 택해야 겠지요.

정답을 말씀 드리자면.. 가장 빠른 방법은? Bulk Insert입니다.

BCP와 Bulk Insert가 같은거 아니냐?

Bulk Insert는 쿼리 분석기에서 수행되며 실행계획이나 작업 수행방식이

스레드 형식으로 처리되고.. BCP는 명령프롬프트에서 수행되며

ODBC인터페이스를 가지고 프로세스로 수행됩니다.

나중에 테스트 결과를 보여 드릴 것이지만...  정답은 Bulk Insert입니다.

 

또한 이런분 계실 겁니다.. - 저는 Bulk Insert보다.. DTS가 빠르던데요..

이런일은 거의 발생하지 않지만...

Bulk Insert의 몇몇 옵션을 잘못 선택하실 경우 문제가 발생할 수 있지요.

 

아니 왜 BCP나 Bulk Insert에 대한 이야기는 안하고..

저런 이야기만 하는 것이냐~~~ -_-;;;

사실 BCP와 Bulk Insert의 주요한 이슈에 대한 변화는 아래에 말씀 드리는게

전부이며.. SQL7과 큰 차이가 없습니다. -_-;;

http://sqler.pe.kr/sqllec/main.asp

이부분의 아래쪽을 보시면? 네.. BCP강좌와 Bulk Insert 이야기가 있습니다.

실습적인 부분은 이곳과.. 온라인 도움말을 이용해 주시길 바랍니다.

 

그럼 이제.. 이슈입니다.

Bulk Insert의 주요한 이슈는 Minimal Logged Operation 입니다.

최소한의 로그만을 사용해 Bulk 작업을 수행해야만 하며.. 

조건이 대단히 많습니다. - 이 조건을 모두 만족해야만 최고 속도로 데이터를

로드할 수 있다는 것이지요.

 

1. 복구 모델이 Simple이거나 Bulk-Logged 이어야 합니다.(단순, 대량로그)

Full Model이면 안되며.. 이 정보는? sp_helpdb로 보실 수 있지요.

2. 타겟 테이블이 복제(Replication) 중이면 안됩니다.

3. 타겟 테이블에 트리거가 존재하면 안됩니다.

4. 타겟 테이블에 데이터가 없거나 인덱스가 없어야 합니다.

5. TABLOCK 힌트가 지정되어 있어야만 합니다.

 

이 옵션들이 지정 되어 있어야만 최고 속도의 Bulk 작업이 가능해 지지요.

 

대부분의 경우 위의 조건들에 상관 없이 쓰시는 분들 역시 많을 것입니다.

또한 이 Bulk 작업에 대한 SQL2000의 관련 문서로..

High Performance Data Loading for SQL Server: Best Practices

PPT가 있으며.. TechED2001 행사에서..

Gert E.R. Drapers가 발표한 내용이며

DAT286: High Performance Data Loading 라는 주제로 발표 했습니다.

http://sqler.pe.kr/dataroom/pds_show.asp?id=94

에서 TechED발표 PPT들을 보실 수 있으며 그중 DAT286.ppt라는 PPT로 등록

되어 있지요. - 조금더 깊은 공부를 하실 분들은 참고 하시길...

자.. 이정도면.. BCP와 Bulk 작업에 대한 이야기는.. 제가 드릴만한 이야기는

드렸네요..

 

도움 되셨길 바라며.. 나머지 자신에게 맞는 여러 옵션들은 자신이 직접

해 보셔야 합니다. 참고 하시길 바랍니다.

그럼 수고하셨구요...

차례에는 메타 데이터와 리니지에 대한 이야기가 있었으나..

강좌에서는.. 사실 드리려 해도.. 프로그래밍적인 이야기가 너무 강한 부분이

될듯해서.. 이곳에서는 다루지 않고.. 나중에라도 팁 게시판에서 다뤄 보도록

하겠습니다.

 

수고하셨습니다. 다음 SQL2000의 XML 프로그래밍 기능 강좌에서 뵙도록 하지요. ^_^

이만.

 

 

 

 

다음검색
현재 게시글 추가 기능 열기

댓글

댓글 리스트
맨위로

카페 검색

카페 검색어 입력폼