주기적 데이터 이관 작업 구현
한대성
MS SQL Server MVP
에이디컨설팅 책임 컨설턴트 | SQLLeader.com 운영자
![]() |
다름이 아니라 대상에서의 테이블의 마지막 날짜를 변수로 지정하고 싶은데요.. 대상에서의 마지막 날짜를 변수로 넣고 이날자를 이용해서 원본의 where 절에 넣어서 그 이후의 값을 대상으로 가져오고 싶은데요... |
서로 다른 서버에 있는 데이터를 주기적으로 동기화하는 간단한 예제를 설명 드리겠습니다. 본 예제에서는 질문에서와는 달리, 날짜 대신 자동 증가하는 Seq 값을 이용해서 설명드리겠습니다.
다음과 같이 두 개의 테이블을 서로 다른 서버에 만듭니다. 하나는 원본 테이블이고, 다른 하나는 대상 테이블 입니다.
원본 서버
USE tempdb
GO
--원본 테이블
CREATE TABLE SourceTable
(
Seq INT identity,
DataCol1 int default(rand()*10000)
)
GO
--1000개의 기본 데이터 입력
INSERT SourceTable DEFAULT VALUES
GO 1000
대상 서버
USE tempdb
GO
--대상 테이블
CREATE TABLE TargetTable
(
Seq INT,
DataCol1 int
)
GO
대상 서버에 저장되어 있는 최종 Seq 값을 읽은 후, 원본 서버에서 이 값 이후의 데이터를 가져오는 패키지를 구현하겠습니다.
빈 패키지를 하나 연 다음, 원본 서버와 대상 서버에 대한 OLE DB 연결을 설정합니다.
변수 창에서 다음과 같이 maxSeq라는 이름의 Int32형 변수를 하나 추가합니다.
이 변수에는 대상 테이블로부터 최대 Seq값을 읽어와서 저장할 것입니다.
이제, 대상 테이블로부터 최대 Seq값을 읽어온 후, maxSeq 변수에 저장하는 작업을 구성하겠습니다. 제어 흐름 영역에 SQL 실행 작업을 하나 추가하고 다음과 같이 설정합니다.
SQLStatement에는 다음과 같은 쿼리를 입력하고, ResultSet을 단일 행으로 설정합니다.
SELECT ISNULL(MAX(Seq), 0) AS MaxSeq FROM TargetTable WITH (NOLOCK) |
이제 결과 집합 탭에서 아래와 같이 설정합니다.
확인을 눌러 편집기 창을 닫고, 데이터 흐름 작업을 하나 추가해서 SQL 실행 작업과 연결합니다.
데이터 흐름 작업을 더블 클릭해서 데이터 흐름 영역을 연 다음, OLE DB 원본을 추가합니다.
추가한 OLE DB 원본의 편집기를 연 다음, 아래와 같이 설정합니다.
오른쪽에 있는 매개 변수(P) 버튼을 클릭해서 쿼리의 매개 변수를 지정합니다.
이제, 열 탭을 클릭해서 원본의 열을 확인한 후, 편집기를 닫습니다.
도구 상자에서 OLE DB 대상을 추가한 후, OLE DB 원본과 연결하고 편집기를 열어 다음과 같이 설정합니다.
매핑 탭을 클릭해서 저장될 열 매핑을 확인하고 편집기를 닫습니다.
자, 다 되었습니다. 패키지를 한 번 실행해 봅시다. 지금 현재는 원본에만 1000개의 데이터가 입력되어 있기 때문에 다음과 같이 1000개의 데이터가 대상 테이블로 이동하겠지요.
원본에다가 1,234개 행을 입력한 후에 패키지를 실행해 봅시다.
참고 사항
데이터를 이관하는 패키지를 간단히 만들어봤습니다. 본 패키지를 이용해서 확장할 수 있는 사항들에 대해서 추가 설명하겠습니다.
1) 로깅 기능 설정
- Seq가 얼마부터 몇 개의 행이 넘어갔는지를 별도의 테이블로 남기는 로깅 기능을 구현할 수 있겠지요. 데이터 흐름 작업에서 원본과 대상 사이에 행 개수 변환을 넣은 다음, 이관된 데이터 행 수를 저장하도록 설정합니다. 그런 다음, 작업의 가장 마지막 부분에 SQL 실행 작업을 추가해서 기록을 로그 테이블에 저장하도록 하면 됩니다. 좀 더 나가서는 전송되는 건을 모니터링 할 수도 있습니다. 이 때는 데이터 흐름 작업의 이벤트 처리기에서 구현해야 합니다.
2) 입력 쿼리
- 본 예제에서는 아주 간단하게 입력 쿼리에 매개 변수를 넘기는 식으로 구현하였지만, 쿼리가 조금만 복잡해지면 매개 변수가 제대로 설정되지 않습니다. (서브 쿼리 형태인 경우)
이럴 경우, 쿼리를 저장할 변수를 하나 만들고 식을 이용해서 쿼리를 만들거나 스크립트 작업을 이용해서 쿼리를 만든 다음, OLE DB 원본의 데이터 액세스 모드에서 변수를 사용한 SQL 명령으로 지정하면 됩니다. 또는, 저장 프로시저로 만든 다음 이를 사용하는 것도 좋은 방법입니다.'연구개발 > DTS & SSIS' 카테고리의 다른 글
텍스트 데이터를 이용한 값 업데이트 하기 (0) | 2011.08.27 |
---|---|
SQL 쿼리와 SSIS 누가 더 빠른가 (0) | 2011.08.27 |
FOR 루프 컨테이너를 이용한 무한 루프 구현하기 (0) | 2011.08.27 |
패키지 내의 연결 정보 읽어오기 (0) | 2011.08.27 |
자식 패키지의 연결 정보 변경하기 (0) | 2011.08.27 |