반응형

주기적 데이터 이관 작업 구현

 

 

한대성

MS SQL Server MVP

에이디컨설팅 책임 컨설턴트 | SQLLeader.com 운영자

 

 

 Question
다름이 아니라 대상에서의 테이블의 마지막 날짜를 변수로 지정하고 싶은데요..
대상에서의 마지막 날짜를 변수로 넣고 이날자를 이용해서 원본의 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 명령으로 지정하면 됩니다. 또는, 저장 프로시저로 만든 다음 이를 사용하는 것도 좋은 방법입니다.
반응형

+ Recent posts