반응형
반응형

웹 서비스를 이용한 환율 정보 읽어오기

 

한대성

MS SQL Server MVP

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

 

 

한동안 때문에 자료를 거의 올렸네요. 추석을 맞이하여 간단하면서도 유용한 자료 하나 올립니다.

고객사를 다니다 보면 환율 정보를 읽어오는 기능에 대해 문의가 많습니다. SSIS 패키지를 이용해서 이를 구현하는 기능은 이전의 강좌글에서 간략히 다루었지만, 다루었던 사이트가 이상 유효하지 않고, 기능적인 부분만 간략히 설명했기 때문에, 상세히 다루겠습니다.

 

 

작업 내용 : 매일 환율 정보를 읽어와서 테이블에 저장하기

 

SSIS 패키지에는 SQL 관련된 기능 외에도 다양한 기능들이 포함되어 있습니다. 이러한 것들 하나인 서비스 작업과 XML 작업 개체를 이용해서 외부에서 환율 정보를 읽어와서 저장하는 기능을 구현하고자 합니다.

 

 

1. 다음과 같은 간단한 테이블을 생성합니다. 환율 정보가 저장될 테이블입니다.

 

CREATE TABLE CurrencyInfo

(

             DateStr smalldatetime,

             Currency float

)

Go

( 예제에서는 localhost tempdb에다가 생성토록 하겠습니다.)

 

2. SSIS 패키지의 연결 관리자에 OLE DB 연결을 하나 추가한 , 1에서 사용한 DB 지정토록 합니다.

 

3. 연결 관리자에 HTTP 연결용 연결 관리자 추가합니다. 연결 관리자는 연결(W) 선택한 나타나는 목록에서 선택해야 합니다. 그런 다음, HTTP 연결 관리자 편집기 창의 서버 URL(U) 부분에 다음과 같은 URL 입력합니다.

http://www.webservicex.com/CurrencyConvertor.asmx?wsdl

 

HTTP 연결을 이용해서 환율 정보를 제공하는 서버에 연결을 하게 됩니다. (누가? 다음에 나오는 서비스 작업 개체가.)

 

4. 우선, 작업 개체를 추가하기 전에 변수 창에 다음과 같은 개의 변수를 추가합니다.

 

하나는 XMLResult라는 Object 변수이며, 다른 하나는 ResultVal이라는 String 변수입니다.

XMLResult라는 변수에는 환율 정보를 읽어온 결과를 저장합니다. 결과 유형은 XML 형태로 넘어오게 됩니다. 이러한 XML 데이터 , 우리가 필요로 하는 환율 부분만을 떼어내서 ResultVal이라는 변수에 저장하게 됩니다.

 

5. 이제 도구 상자에서 서비스 작업 개체를 선택한 , 제어 흐름 영역에 추가합니다.

추가한 서비스 작업 개체의 작업 편집기를 다음 아래와 같이 HttpConnection 부분을 위에서 추가한 연결로 설정하고, WSDLFile 부분에 적당한 경로를 지정합니다. WSDL 파일에는 서비스에서 제공하는 여러 메소드에 대한 정보가 저장되게 됩니다. 파일이 없는 경우에는 아래에 있는 WSDL 다운로드(D) 버튼을 클릭해서 다운받도록 합니다.

 

 

6. 서비스 작업 편집기 입력 탭을 선택한 , 아래와 같이 환율 정보를 읽어올 항목을 설정합니다.

우리는 USD 대한 KRW 정보, 1달러에 대한 원화의 정보를 읽어오고자 하기 때문에 위와 같이 FromCurrency에는 USD, ToCurrency에는 KRW 입력하였습니다. 필요한 경우에는 이러한 값들을 SSIS 변수에 저장해 놓고 변수를 지정하는 식으로도 구현할 있습니다.

 

7. 이제 읽어온 결과값을 저장하는 곳을 설정하는 부분입니다. 출력 탭을 선택한 , 아래와 같이 4단계에서 추가한 Object 변수를 선택합니다.

 

8. 이제 도구 상자에서 XML 작업 추가한 , 서비스 작업 연결합니다.

 

9. XML 작업을 더블 클릭해서 XML 작업 편집기를 , 아래와 같이 세부 항목을 설정합니다.

XMLResult라는 변수에 저장된 XML 데이터 중에서 숫자 부분만을 추출하여 이를 다른 변수에 저장하는 기능을 구현하는 것이며 XPath라는 작업 형태로 설정하게 됩니다.

 

10. 이제 SQL 실행 작업 추가한 , XML 작업 연결합니다.

 

11. SQL 실행 작업 편집기에서 Connection 부분은 2에서 추가한 SQL 연결을 선택합니다.

SQLStatement 부분에 다음과 같은 쿼리문을 입력합니다.

INSERT CurrencyInfo(DateStr, Currency)

SELECT getdate(), ?

 

, BypassPrepare 옵션이 True 되어 있는지 확인합니다. (서비스 2 이후로는 속성의 기본값이 True 변경되었습니다. 혹시나 서비스 2 이전 버전에서 작업할 경우, 제대로 작동하지 않을 있습니다. 가능한 서비스 2 이상을 설치하신 구현하시기 바랍니다.)

 

12. 매개 변수 매핑 탭에서 다음과 같이 쿼리의 ? 부분에 입력될 변수를 설정합니다.

, 빨간색으로 표시된 것과 같이, 변수 이름, 데이터 형식, 매개 변수 이름에 유의해서 입력합니다.

변수의 데이터 형식은 String 이지만, 쿼리에 입력될 때에는 Float형으로 처리되어 입력하도록 하기 위함이며, 매개 변수 이름의 0, OLE DB 연결에서 번째 나오는 매개 변수 부분(? 표시된 부분)이라는 것을 지정하는 것입니다.

 

13. , 이제 패키지를 실행해 봅니다.

 

 

 

 

환율 정보가 진짜 맞는지 Yahoo.com(http://finance.yahoo.com/currency) 정보와 비교해 봅시다.

 

 

 

환율 정보 외에도 메일 주소 유효성 검사, 날씨 정보, 경제 지표 다양한 형태의 정보를 읽어올 있습니다. 예제를 참고해서 여러 형태로 활용해 보시기 바랍니다.

반응형
반응형

에러 처리를 이용한 데이터 동기화 작업

 

한대성

MS SQL Server MVP

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

 

 

서버간 데이터를 동기화 하는 작업에서 SSIS를 이용해서 효과적으로 처리할 수 있습니다.

이미 이전 몇 개의 기술자료에서 이를 언급하였습니다.

 

Ÿ          원격 서버간 데이터 구현

Ÿ          엑셀 파일과 테이블 데이터 동기화하기

Ÿ          조회 변환을 이용한 데이터 처리

Ÿ          조회 변환을 이용한 데이터 동기화 작업

 

원격 서버 간에 데이터를 동기화 하는 방법은 SSIS에서 뿐만 아니라 ETL 작업에서 자주 언급되는 주제입니다.

지금까지는 주로 조회(Lookup) 변환을 이용해서 이를 구현하는 방안을 소개하였습니다. 조회 변환을 이용하는 형태는 대상 테이블의 건수가 적을 때에는 매우 효과적이지만, 만약 동기화 해야 할 데이터가 많은 경우, 조회를 위한 메모리 캐싱 작업에서 많은 시간과 부하가 걸리는 단점이 있습니다.

본 글에서는 조회 변환 대신 대상 테이블의 에러 처리를 이용해서 구현하는 방법을 다뤄보겠습니다.

 

다음과 같은 시나리오를 이용해서 설명합니다.

 

원본 서버의 테이블과 대상 서버의 테이블은 각각 Primary Key(또는 Unique 제약 조건)이 있습니다. 원본의 데이터 중 새로 발생된 데이터만 입력하고 기존의 데이터는 별도의 테이블에 저장하고자 합니다.

 

Source Instance: localhost

USE TEMPDB

GO

 

IF EXISTS (SELECT * FROM SYSOBJECTS WHERE NAME='SOURCE' AND XTYPE = 'U')

DROP TABLE SOURCE

GO

 

--원본 테이블

CREATE TABLE SOURCE

(

        SEQ INT IDENTITY,

        VAL VARCHAR(10) DEFAULT('AAA'),

        CONSTRAINT PK_SOURCE PRIMARY KEY(SEQ)

)

GO

  

--임의 데이터 발생

SET NOCOUNT ON

DECLARE @I AS INT

SET @I = 1

 

WHILE @I<=100

BEGIN

INSERT SOURCE DEFAULT VALUES

SET @I = @I + 1

END

SET NOCOUNT OFF

GO

 

Target Instance: localhost\SS2005

USE TEMPDB

GO

 

IF EXISTS (SELECT * FROM SYSOBJECTS WHERE NAME='TARGET' AND XTYPE = 'U')

DROP TABLE TARGET

GO

 

--대상 테이블

CREATE TABLE TARGET

(

        SEQ INT,

        VAL VARCHAR(10),

        CONSTRAINT PK_TARGET PRIMARY KEY(SEQ)

)

GO

 

일단 여기까지 수행해서 원본에는 100개의 데이터를 넣고선 다음과 같이 패키지를 구성합니다.

일단 한 번 패키지를 수행하면 정상적으로 100개의 데이터가 이관될 것입니다.

 

, 그럼 원본에서 10개 정도의 데이터를 추가로 입력한 후, 다시 패키지를 돌려봅시다.

Target 테이블에 Seq열에 Primary Key가 설정되어 있기 때문에 당연히 중복 에러로 인해서 실패가 납니다.

 

이걸 막기 위해, 이전에는 원본과 대상 중간에 조회 변환을 두고선, 대상 테이블의 데이터를 읽어와서 조회 작업을 수행한 후, 조회가 되지 않는 데이터(오류 데이터)만 대상으로 입력하는 방식으로 구현했습니다.

 

이번에는, 이와는 달리 OLE DB 대상에서 처리하도록 합니다.

OLE DB 대상을 더블 클릭해서 편집기를 연 다음, 아래 그림과 같이 데이터 액세스 모드를 기본값인 테이블 또는 뷰 빠른 로드에서 테이블 또는 뷰로 변경합니다. (빠른 로드만 아니면 됩니다.)

 

그런 다음, 오류 출력 탭을 선택한 후, 다음과 같이 오류 부분의 속성을 행 리디렉션으로 변경합니다.

 

참고로, 데이터 액세스 모드가 빠른 로드인 경우에는 오류 출력을 설정할 수 없습니다.

 

일단 여기까지 설정하면 아래와 같이 OLE DB 대상에 기분 나쁜(^^) 경고 표시가 나타납니다. 오류를 다른 경로로 출력하도록 설정해 놓고선 다른 경로를 지정하지 않았기 때문입니다.

, 그럼 대상 서버에 다음과 같이 오류 데이터를 저장할 테이블을 만듭니다.

Target Instance: localhost\SS2005

USE TEMPDB

GO

 

IF EXISTS (SELECT * FROM SYSOBJECTS WHERE NAME='EXISTDATA' AND XTYPE = 'U')

DROP TABLE EXISTDATA

GO

 

--기존 데이터 테이블

CREATE TABLE EXISTDATA

(

        SEQ INT,

        VAL VARCHAR(10),

        CONSTRAINT PK_EXISTDATA PRIMARY KEY(SEQ)

)

GO

 

 그런 다음, OLE DB 대상을 하나 더 추가하고선 OLE DB 대상의 빨간 선(오류 출력)을 연결합니다.

연결하면 자동으로 오류 설정 창이 나타나지만, 이미 설정했기 때문에 그냥 확인을 누릅니다.

 

새로 추가한 OLE DB 대상(그림에선 기존 데이터”)을 더블 클릭해서 편집기를 연 다음, 새로 생성한 테이블을 지정하고 매핑 탭에서 열을 설정합니다.

 

 

, 여기까지 설정한 후에 패키지를 실행해 봅시다.

 

 

110개가 입력되었고, 이 중에서 기존에 있었던(=PK 중복 오류가 발생한) 데이터는 별도로 빠지고(100), 나머지 데이터가 입력됩니다.

 

이렇게 별도로 분리된 기존 데이터는 SQL 실행 작업을 이용해서 DELETE-INSERT를 하거나 UPDATE를 하도록 처리하면 될 것입니다.


만약, 중복된 데이터인 경우에는 무시하고 싶다면, 에러 처리 부분에서 행 리디렉션 대신에 오류 무시로 설정하면 됩니다.

 

 

조회를 이용한 작업과 비교해 볼 때, 데이터 캐싱 단계를 없앨 수 있기 때문에 대량 데이터인 경우에는 우수한 성능을 낼 수 있습니다.

하지만 다음과 같은 단점도 있습니다. 우선 데이터 처리 방식으로 인해 처리되는 속도가 빠른 처리 모드에 비해 약간 저하될 수도 있습니다. 또한, PK 외에 열에 대해 중복 체크를 하기 위해서는 대상 테이블에 Unique 제약 조건과 같은 부가적인 설정을 해 줘야 합니다.

 

반드시 이 방법이 데이터 동기화 처리에서 최상은 아닙니다. 테이블의 형태가 각기 다른 만큼 최적 방법도 모두 다르기 때문에 상황에 맞게 적절한 방식을 적용하는 것이 최상입니다.

 

 

반응형
반응형

스크립트 변환을 이용한 열 생성하기

 

한대성

MS SQL Server MVP

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

 

 

다음과 같은 일자 및 시간 열에 대해 아래 조건에 따른 파생 열을 생성하는 방법을 살펴보겠습니다.

 

CREATE TABLE DATETABLE

(

        date char(8),

        time char(6)

)

GO

 

INSERT DATETABLE VALUES ('20070703','162541')

INSERT DATETABLE VALUES ('20070505','221305')

INSERT DATETABLE VALUES ('20080221','101511')

INSERT DATETABLE VALUES ('20110411','031120')

INSERT DATETABLE VALUES ('20030109','120144')

INSERT DATETABLE VALUES ('20060527','160010')

GO

 

SELECT * FROM DATETABLE

GO

/*

date     time

-------- ------

20070703 162541

20070505 221305

20080221 101511

20110411 031120

20030109 120144

20060527 160010

*/

 

파생 생성 규칙

) 20070703 162541  à 7G031

A. 7 년도

B. 알파벳은 (A,B,C,D,E,F,G,H,I,J,K,L,M)

C. 다음 자리는

D. 마지막 자리는 / 08 ~ 21 이전 = 1, = 2

 

 

1. 쿼리로 구현하기

 

입력 데이터가 SQL 테이블인 경우에는 쿼리를 이용하는 것이 가장 편리한 방법입니다.

제어 흐름 영역에 데이터 흐름 작업 하나 추가하고 OLE DB 원본 추가합니다.

OLE DB 원본에서 해당 테이블이 있는 DB 연결을 설정한 , 데이터 액세스 모드(A) SQL 명령으로 변경하고 SQL 명령 텍스트(S) 다음과 같은 쿼리를 입력합니다.

 
 

SELECT

        CAST(CAST(SUBSTRING(date, 3,2) AS INT) AS VARCHAR)

        + CHAR(64 + CAST(SUBSTRING(date, 5,2) AS INT))

        + RIGHT(date,2)

        + CASE WHEN TIME>='080000' AND TIME<'210000' THEN '1' ELSE '2' END

        AS LOTNUM

FROM DATETABLE

 

데이터 대상 또는 변환 작업을 설정하고 처리되는 결과를 확인합니다.

 

 

 

2. 스크립트 변환으로 구현하기

 

만약, 입력 데이터가 텍스트 파일과 같이 직접 쿼리를 이용하지 못할 경우에는 SSIS에서 이러한 식을 구현해야 합니다. 파생 변환 SSIS 식을 이용해서 이를 구현해도 되지만, 예제의 조건에서 월에 대한 변환 부분에서 상당히 식을 이용해야 하기 때문에 작성이나 관리에 어려움이 있습니다.

대신, 스크립트 구성요소 - 변환 이용해서 간단히 구현할 있습니다.

 

OLE DB 원본에서 데이터 액세스 모드(A) 테이블 또는 선택하고 해당 테이블을 선택합니다.

 

도구 상자에서 스크립트 구성 요소 선택하여 추가한 , 변환으로 설정하고, OLE DB 원본 연결합니다.

스크립트 변환 편집기 입력 탭에서 사용 가능한 입력 부분에 열을 모두 선택합니다.

 

/출력 탭에서 [출력 0] à [출력 ] 부분에 LOT라는 열을 추가하고 DataType 문자열[DT_STR], Length 6으로 설정합니다.

 

스크립트 에서 스크립트 디자인(S) 클릭해서 VSA(Visual Studio for Applications) 다음, 다음과 같은 스크립트를 입력합니다.

Imports System

Imports System.Data

Imports System.Math

Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper

Imports Microsoft.SqlServer.Dts.Runtime.Wrapper

 

Public Class ScriptMain

    Inherits UserComponent

 

    Public Overrides Sub 입력0_ProcessInputRow(ByVal Row As 입력0Buffer)

        Dim tmpStr As String

        Dim inpDate As String = Row.date.ToString

 

        tmpStr = CInt(inpDate.Substring(2, 2)).ToString

        tmpStr = tmpStr + Chr(64 + CInt(inpDate.Substring(4, 2)))

        tmpStr = tmpStr + inpDate.Substring(6, 2)

 

        If Row.time.ToString >= "080000" And Row.time.ToString < "210000" Then

            tmpStr = tmpStr + "1"

        Else

            tmpStr = tmpStr + "2"

        End If

        Row.LOT = tmpStr

    End Sub

 

End Class

 

처리되는 결과를 확인합니다.

 

 

 

 

 

반응형
반응형

다중 쿼리 파일 실행하기

 

한대성

MS SQL Server MVP

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

 

 Question
수백개가 넘는 쿼리문을 한개씩 쿼리분석기에 넣어서 실행하고 있습니다.
혹시 수백개의 쿼리문을 한번에 실행하는 방법좀 알려주세요.
 

특정 디렉터리에 저장되어 있는 다수의 쿼리 파일을 실행해야 경우에 대한 방법에 대해 살펴보겠습니다.

 

예를 들어 다음과 같이 D:\SQLQuery라는 디렉터리에 실행시켜야 쿼리 파일들이 여러 있는 경우입니다.

 

 

1. SQL Server 2005 Integration Services 이용하기

Integration Services 이용하면 간단히 수행할 있습니다.

 

1)       제어 흐름 영역에서 마우스 오른쪽 클릭을 해서 나타나는 메뉴 , 변수(S) 선택한 , 쿼리 파일의 경로를 저장할 String 변수를 하나 추가합니다.

 

2)       도구 상자에서 Foreach 루프 컨테이너 하나 추가한 , 더블 클릭을 하여 편집기를 다음, 컬렉션 탭에서 Foreach File 열거자 선택하고 아래와 같이 폴더(F) 파일(I), 파일 이름 검색 부분을 설정합니다.

 

3)       변수 매핑 탭에서 1)에서 추가한 변수를 설정하고 인덱스를 0으로 선택합니다.

 

4)       확인 눌러 편집기를 닫은 다음, 제어 흐름 영역 아래 쪽에 있는 연결 관리자에서 마우스 오른쪽 클릭해서 나타나는 메뉴 파일 연결(F) 선택하여 새로운 파일 연결을 추가하고 다음과 같이 임의의 파일을 지정합니다.

 

5)       연결 관리자에서 4)에서 추가한 파일 연결의 이름을 적절히 변경합니다. 그런 다음, 해당 연결을 선택한 상태에서 나타나는 속성 중에서 Expressions 부분의 ... 버튼을 클릭합니다.

 

6)       속성 편집기에서 ConnectionString 속성을 선택한 , 아래와 같이 부분에 1)에서 추가한 변수를 입력합니다. 직접 입력해도 되며 ... 버튼을 클릭해서 편집기에서 해당 변수를 지정해도 됩니다.

 

7)       이제 도구 상자에서 SQL 실행 작업 Foreach 루프 컨테이너 내에 추가합니다.

 

8)       SQL 실행 작업을 더블 클릭해서 편집기를 다음, Connection 속성 부분에서 < 연결..> 선택하여 쿼리를 실행할 DB 연결을 추가합니다.

 

9)       SQLSourceType 속성값을 파일 연결 설정하고 FileConnection 값을 4)에서 추가한 파일 연결로 설정합니다.

 

10)   확인 눌러 편집기를 닫은 , 패키지를 실행하면 해당 디렉터리에 있는 모든 sql 파일들이 차례대로 실행됩니다.

 

 

 

2. SQL Server 2000 에서 Shell Script isql 이용하여 처리

만약 Integration Services 이용할 없는 경우에는 다음과 같은 간단한 Shell Script isql 유틸리티를 이용하여 구현합니다. Isql 유틸리티는 SQL 2000 포함되어 있는 프로그램입니다.

 

Ex) ScriptRun.cmd

FOR %%b in (d:\SQLQuery\*.sql) DO isql -S localhost -U sa -P pwd -i %%b

 

스크립트 서버 명이나 연결 계정을 맞게 지정한 , 스크립트를 실행하면 해당 디렉터리의 모든 쿼리들이 실행됩니다.

 

 

 

반응형
반응형

스크립트 변환에서 변수 이용하기

 

한대성

MS SQL Server MVP

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

 

 

 

데이터 흐름 내의 스크립트 변환에서 SSIS의 외부 변수를 이용하는 방법에 대한 간단한 예제를 설명하겠습니다.

 

예를 들어, 위와 같이 Col로 이루어진 입력 데이터에서 Seed라는 SSIS 변수의 값부터 시작하는 Identity 열을 추가하는 형태를 구현합니다.

 

우선, SSIS 변수를 하나 추가합니다. 변수 추가는 제어 흐름 영역에서 빈 곳을 마우스 오른쪽 클릭해서 나타나는 메뉴 중, 변수(S)를 선택하면 변수를 정의할 수 있는 창이 나타납니다.

여기서, Seed라는 Int32형 변수를 정의하고 임의의 값을 지정합니다.

 

제어 흐름 영역에 데이터 흐름 작업을 하나 추가한 후, 해당 데이터 흐름 영역에서 OLE DB 원본 또는 플랫 파일 원본 등과 같은 원본 개체를 이용해서 위와 같은 형태의 데이터 원본을 정의하고 스크립트 구성요소(변환)을 추가하고 원본과 연결합니다.

 

 

 

스크립트 변환 편집기입력 열 탭에서 Col 열을 선택합니다.

/출력 탭의 출력 0의 출력 열 부분에 Seq라는 열을 추가합니다. 이 열은 스크립트 변환에 의해서 추가되는 열을 말합니다.

 

이제 스크립트 탭에서 스크립트 내에서 사용할 변수를 정의합니다. ReadOnlyVariables 속성에 앞에서 정의한 변수인 Seed를 설정합니다. 만약 이 변수의 값이 스크립트 내에서 참조만 할 경우에는 ReadOnlyVariables에 추가를 하며, 변수에 값을 설정할 경우에는 ReadWriteVariables 속성에 변수를 설정합니다.

 

 

스크립트 디자인(S) 버튼을 클릭해서 VSA(Visual Studio for Applications)를 연 후, 다음과 같은 스크립트를 입력합니다.

Imports System

Imports System.Data

Imports System.Math

Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper

Imports Microsoft.SqlServer.Dts.Runtime.Wrapper

 

Public Class ScriptMain

    Inherits UserComponent

 

    Dim seq As Integer

    Public Overrides Sub 입력0_ProcessInputRow(ByVal Row As 입력0Buffer)

        Row.Seq = seq + Me.Variables.Seed

        seq = seq + 1

    End Sub

 

    Public Sub New()

        seq = 0

    End Sub

End Class

 

임의의 데이터 대상 또는 멀티 캐스트 등과 같은 변환을 연결하여 처리되는 데이터를 확인합니다.

 

 

반응형
반응형


원격 서버간 데이터 동기화 구현

 

한대성

MS SQL Server MVP

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

 

 

이전에 다루었던 주제와 상당히 비슷한 내용인데, 조금 더 상세하게 설명하겠습니다.

 

 

[업무 요구 사항]

Ÿ           원본 서버(MSSQL or Oracle or Text File)의 데이터를 정기적으로 대상 서버로 동기화 해야 합니다.

Ÿ           원본의 데이터는

ž            신규로 발생되는 경우도 있고,

ž            기존 데이터가 변경되는 경우도 있으며,

ž            삭제되는 경우도 있습니다.

Ÿ           이러한 작업을 ETL Process로 처리하고자 합니다.  

 

데이터베이스의 규모가 커지고 사용 범위가 확대되면서 이와 같이 외부 데이터 시스템의 데이터를 동기화 시키는 작업의 요구가 많아지고 있습니다. 복제나 로그 전달(Log Shipping), 미러링(Data Mirroring)과 같은 기능을 이용하여 데이터베이스 전체 또는 특정 테이블을 동기화 하는 것도 좋은 방안일 수 있습니다.

 

하지만, 저장 공간의 문제나 구축 및 관리 상의 문제로 단순히 SSIS 또는 DTS와 같은 ETL 패키지를 이용하여 동기화 하는 작업을 구현하는 것이 간단할 수도 있습니다.

 

본 글에서는 SSIS를 이용하여 이러한 작업을 구현하는 예제와 구현 시 고려해야 할 사항들을 살펴보도록 하겠습니다.

 

 

1. 원본 및 대상 테이블 생성

Source Instance: localhost

USE TEMPDB

GO

 

IF EXISTS (SELECT * FROM SYSOBJECTS WHERE NAME='SOURCE' AND XTYPE = 'U')

DROP TABLE SOURCE

GO

 

--원본 테이블

CREATE TABLE SOURCE

(

       SEQ INT IDENTITY,

       VAL VARCHAR(10) DEFAULT('AAA'),

       CONSTRAINT PK_SOURCE PRIMARY KEY(SEQ)

)

GO

 

--임의 데이터 발생

SET NOCOUNT ON

DECLARE @I AS INT

SET @I = 1

 

WHILE @I<=10000

BEGIN

INSERT SOURCE DEFAULT VALUES

SET @I = @I + 1

END

SET NOCOUNT OFF

GO

 

Target Instance: localhost\SS2005

USE TEMPDB

GO

 

IF EXISTS (SELECT * FROM SYSOBJECTS WHERE NAME='TARGET' AND XTYPE = 'U')

DROP TABLE TARGET

GO

 

--대상 테이블

CREATE TABLE TARGET

(

       SEQ INT,

       VAL VARCHAR(10),

       CONSTRAINT PK_TARGET PRIMARY KEY(SEQ)

)

GO

 

 

2. SSIS 패키지 생성

1)       빈 패키지를 생성한 후, SourceDB TargetDB에 대한 OLE DB 연결을 추가합니다.

            

2)       제어 흐름 영역데이터 흐름 작업을 추가한 후, 더블 클릭해서 데이터 흐름 작업 영역을 엽니다. 데이터 흐름 영역에서 OLE DB 원본을 추가한 후, 다음과 같이 설정합니다.

 

            데이터 액세스 모드(A) 부분에서 테이블 또는 뷰를 선택한 후, 원본 테이블을 사용해도 되지만 가급적이면 위와 같이 SQL 명령을 선택한 후, 작업에 필요한 최소한의 열만 선택하도록 합니다. 원본 데이터가 위와 같이 SQL Server의 테이블에 있는 데이터인 경우, WITH (NOLOCK) 옵션을 사용하여, 원본의 데이터를 읽어오는 중에 불필요한 블로킹이 발생하지 않도록 설정합니다.

 

3)       조회 변환을 추가한 후, 원본과 연결하고 다음과 같이 설정합니다.

본 단계에서도 필요한 열에 대해서만 가지고 오도록 설정하기 위해 SQL 쿼리를 이용하도록 합니다.

 

4)       탭에서 Source 테이블과 Target 테이블의 키 열인 Seq 열을 연결시키고, 조회 열의 Val 열을 선택한 후, 출력 별칭 Val에서 Val2로 변경합니다.

 

원본의 Seq열 데이터에 대해 조회 테이블에 이 값이 있는지 확인합니다. 이 때 주의해야 할 것은 반드시 Key 열에 대해서만 연결을 지정해야 하며, 다른 열은 삭제해줘야 합니다. (SSIS에서는 열 이름이 동일할 경우, 자동으로 연결을 시키기 때문에 Val열에 대해서도 연결선이 생성됩니다. Val열은 Key 열이 아니기 때문에 삭제를 해 줘야 합니다.)

 

추가로 이 부분에 대해 조금 구체적으로 설명하겠습니다.

Source

Seq

Val

1

AAA

2

BBB

3

CCC

Target

Seq

Val

1

AAA

2

AAA

 

Source 테이블의 키 열인 Seq 열의 값을 Target 테이블의 Seq 열과 조회 작업을 수행합니다. Seq 1, 2인 경우에는 매치가 되기 때문에 조회가 성공으로 처리됩니다. Seq 3인 경우에는 Target에 해당 데이터가 없기 때문에 조회가 실패로 처리가 됩니다. 결국 조회가 실패라는 것은 신규 데이터라는 것이기에 Target 테이블에 Insert 해 주면 됩니다.

조회된 데이터인 첫 번째, 두 번째 행에 대해서는 하위 열이 변경되었는지를 판단해야 합니다. 이러한 판단 작업을 수행하기 위해 위의 그림에서와 같이 조회 테이블(=Target) Val열을 추가해서 출력시키는 것입니다.

 

5)       오류 출력 구성(G)를 클릭한 후, 오류의 방법을 행 리디렉션으로 변경합니다.

 

6)       데이터 흐름 영역OLE DB 대상을 추가한 후, 조회 작업의 적색 선을 연결하고 OLE DB 대상을 다음과 같이 설정합니다.

대상 테이블에 데이터를 입력하는 동안 조회 작업이나 다른 작업이 없는 경우에는 테이블 잠금(O) 옵션을 체크해 주는 것이 성능상 유리합니다. 만약, 신규로 처리되는 건이 많고 대상 테이블이 계속 사용된다면 테이블 잠금 옵션을 해제하고 필요에 따라 최대 삽입 커밋 크기(M)의 값을 0 (모든 데이터 일괄 처리) 대신 다른 값으로 설정하도록 합니다.

테이블을 지정한 후, 매핑 탭을 클릭해서 입력 데이터에 대해 매핑을 설정합니다.

 

7)       이제 변경된 데이터에 대한 업데이트 작업을 수행하는 단계를 설정합니다. 데이터 흐름 영역조건부 분할을 추가한 후, 다음과 같이 조회 작업의 녹색 선과 연결하고 조건부 분할의 편집기에서 조건을 설정합니다.

 

8)       OLE DB 명령을 추가한 후, 조건부 분할 변환과 연결합니다. 이 때 출력 이름을 선택하는 창이 나타나는데, 기본 출력 대신 『수정 데이터』 경로를 선택합니다.

 

9)       OLE DB 명령의 편집 창에서 연결 관리자를 TargetDB로 설정하고 구성 요소 속성 탭의 SqlCommand 속성에

UPDATE Target SET Val = ? WHERE Seq = ?

             을 입력합니다.

            

 

10)    열 매핑 탭에서 Seq 열을 Param_1, Val 열을 Param_0에 매핑 시킵니다.

오른쪽에 나타나는 사용 가능한 대상 열은 앞의 쿼리에서 ?로 표시한 대로 나타나며 쿼리의 첫 번째가 Param_0, 두 번째가 Param_1 등으로 매핑됩니다.

만약 매핑 해야 할 열이 상당히 많은 경우에는 정확한 매핑이 되기 어려우며, 필요한 경우 가공 작업이나 변환 작업이 수행되어야 하기 때문에 가능한 한 위의 경우와 같이 직접 쿼리를 지정하는 대신 별도의 저장 프로시저를 만든 후 이 프로시저를 이용할 것을 권장합니다. 저장 프로시저를 사용할 경우, 위와 같이 Param_0, Param_1 로 나타나는 대신 해당 저장 프로시저의 입력 매개 변수가 표시됩니다.

 

 

, 이제 한 번 패키지를 수행해 보도록 하겠습니다.

현재는 Source 테이블에만 10,000개의 데이터가 들어있기 때문에 Target 테이블에 모두 이관될 것입니다.

 

 

이제 Source 테이블에 다음과 같이 500개의 신규 데이터를 발생시키고, 또한 기존 데이터의 일부를 수정해 보도록 하겠습니다.

 

Source Instance: localhost

--신규 데이터 발생

SET NOCOUNT ON

DECLARE @I AS INT

SET @I = 1

 

WHILE @I<=500

BEGIN

INSERT SOURCE DEFAULT VALUES

SET @I = @I + 1

END

SET NOCOUNT OFF

GO

 

--기존 데이터 수정

UPDATE SOURCE

SET VAL = 'BBB'

WHERE SEQ BETWEEN 1001 AND 1300

GO

--(300 적용됨)

 

신규 데이터 500개가 추가되며, 기존 데이터 중 300개가 수정된 것을 확인할 수 있습니다.

 

 

여기까지 UpSert(Update + Insert) 작업이 구현되었습니다. 하지만, 다음과 같은 성능과 관련된 사항을 고려해 볼 수 있습니다.

다음 그림은 Target 테이블에 Update 작업이 수행될 때 프로파일러를 이용해서 수행되는 쿼리를 확인한 결과입니다.

수정을 해야 할 경우, 개별 행 단위로 처리가 됩니다. , 위의 경우에는 Target 테이블에 300번의 Update 문이 수행되었습니다. 만약 신규 입력된 데이터에 비해 변경 데이터가 거의 없는 경우에는 지금과 같은 형태로 구현해도 성능상 큰 문제가 없습니다. 하지만 수정 데이터가 많은 경우에는 대상 테이블에 엄청난 부하를 발생시킬 수 있습니다.

 

이러한 경우에는 OLE DB 명령을 수행하는 대신 다른 방법을 사용해야 합니다.

여러 방법이 있겠지만, 필자는 다음과 같은 형태로 생각해 보았습니다.

업데이트를 수행해야 하는 데이터를 개별 행 단위로 업데이트를 수행하는 대신, 임시 테이블에 저장시켜 놓고, 변환 작업이 끝난 후 이 임시테이블의 데이터를 이용하여 Target 테이블에 일괄 업데이트를 수행하는 방식입니다.

 

우선, 현재의 데이터 흐름 작업을 수행하기 전에 임시 테이블을 만드는 SQL 실행 작업을 추가합니다.

 

 

[SQLStatement]

IF EXISTS (SELECT * FROM sysobjects WHERE xtype = 'u' AND name = 'tmpupdTarget')

  DROP TABLE tmpupdTarget

GO

 

 

CREATE TABLE tmpupdTarget

(

    Seq INT,

    Val2 VARCHAR(10)

)

GO

 

다음 단계로 진행하기 전에 쿼리 분석기에서 위의 쿼리를 수행하여 이 임시 테이블을 생성시켜 놓습니다.

(만약 테이블이 없는 상태이며, 패키지의 작업 개체에서 DelayValidation 옵션이 False인 경우, 패키지가 시작될 때 데이터 흐름 작업에서 대상 테이블이 없다고 판단하여 유효성 검사 실패 에러가 발생하게 됩니다. 따라서, 미리 테이블을 만들어 놓거나, 아니면 데이터 흐름 작업의 DelayValidation 속성 값을 True로 변경시킨 후 패키지를 실행해야 합니다.)

 

또한, 데이터 흐름 작업 다음에 이 임시 테이블을 이용해서 업데이트를 수행하는 SQL 실행 작업을 추가하고 다음과 같이 설정합니다.

 

 

[SQLStatement]

UPDATE A

SET A.Val = B.Val2

FROM Target A JOIN tmpupdTarget B ON A.Seq = B.Seq

GO

 

 

이제, 데이터 흐름 작업 내에서 OLE DB 명령 대신 OLE DB 대상을 추가하고 다음과 같이 tmpupdTarget 테이블을 선택하고, 매핑 탭에서 Seq 열과 Val2 열에 대해 매핑을 설정합니다.

 

 

 



(Head1ton의 말 : Val2 에 Val2로 매칭하니 업데이트가 안된다. 왼쪽의 Val로 매칭시켜주니깐 된다..-_-;)

 

, 이제 다시 쿼리 분석기에서 임의의 수정 데이터를 만든 후에 패키지를 실행시켜서 정상적으로 수행되는지 확인합니다.

 

프로파일러로 수행된 쿼리를 확인하면 다음과 같습니다.

 

 

 

이제 삭제 단계가 남았습니다. 본 단계는 앞의 작업들과 상당히 유사하기 때문에 간단히 설명 만으로 대체하겠습니다.

(첨부된 예제 파일에는 구현해 놓았습니다.)

 

삭제 단계는 InsertUpdate와는 반대로 Target 테이블이 원본이 되며 Source 테이블이 조회 테이블이 됩니다. 이 때 조회 쿼리는 키 열인 Seq 열에 대해서만 비교하면 됩니다. Target 테이블의 데이터 중 Source 테이블의 데이터가 조회되지 않는 경우가 삭제된 데이터이기 때문에 조회가 실패한 데이터를 별도의 임시 테이블로 적재하고, 이 임시테이블의 데이터를 이용해서 Target 테이블의 데이터를 삭제하도록 수행합니다.

 

 

 

[참고 글]

http://www.sqlleader.com/mboard.asp?exec=view&strBoardID=SS2005SSIS&intSeq=779

http://www.sqlleader.com/mboard.asp?exec=view&strBoardID=SS2005SSIS&intSeq=682

http://www.sqlleader.com/mboard.asp?exec=view&strBoardID=SS2005SSIS&intSeq=409

 

 

반응형
반응형

레코드 셋 결과 집합을 스크립트 작업에서 읽어오기

 

한대성

MS SQL Server MVP

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

 

 

SQL에서 임시 테이블이 자주 사용되는 것과 마찬가지로 SSIS에서는 결과 집합을 메모리 변수에 저장하는 방식이 자주 사용됩니다. 예를 들어, 메일 발송 대상을 읽어온 후 차례대로 발송하거나 결과 집합을 파일이나 메시지로 출력할 경우에도 이용할 수 있습니다.

 

지금까지 소개한 방식은

a.       SQL 실행 작업에서 데이터를 읽어온 다음, Object형 변수에 저장

b.       Foreach 루프 컨테이너에서 Foreach ADO 열거자를 선택한 다음, Object형 변수를 선택

c.       변수 매핑 탭에서 각 열에 해당하는 변수를 매핑

d.       Foreach 루프 컨테이너 내에 스크립트 작업 또는 SQL 실행 작업을 추가한 다음, 사용할 변수를 지정하고 이 변수 값들을 이용하여 처리하는 스크립트 작성

또는 데이터 흐름 작업에서 스크립트 원본으로 데이터를 읽어와서 처리하는 방식 입니다.

 

이러한 방식에는 다음과 같은 어려움이 있습니다.

1.       출력되는 열의 수가 고정 어떤 열이 출력될 것인지가 미리 정해져야 합니다. 만약, 데이터베이스 내의 모든 테이블 또는 임의의 여러 테이블들을 파일로 출력하고자 할 경우에는 불가능합니다.

2.       작업 설정의 번거로움 각 열에 대한 정의 작업이 필요합니다.

 

이러한 점은 데이터를 Object형 변수에 입력하는 부분 보다는 출력하는 부분의 특성 때문입니다.

 

 

이러한 방식에 대한 새로운 처리 방법을 소개합니다.

 

다음 예제는 AdventureWorks DB에 있는 테이블 중 임의의 한 개의 테이블을 읽어온 다음, 이 테이블의 데이터를 파일로 출력하는 예제입니다.

 

1.       SQL 실행 작업을 하나 추가한 후, 다음과 같이 AdventureWorks에서 임의의 테이블 명을 읽어오는 쿼리를 지정하고, 결과 값을 TableName이라는 자형 변수에 저장하도록 설정합니다.

 (이와 관련된 자세한 설정 방법은 이전 예제를 참고하시기 바랍니다.)

--임의의 테이블 이름 읽어오기

WITH TableListName(RowNum, TableName) AS

(

        SELECT

               ROW_NUMBER() OVER (ORDER BY B.Name) as RowNum,

               a.name + '.' + b.name  AS TableName

        FROM sys.schemas A join sys.tables B

                on a.schema_id = b.schema_id

        WHERE B.type = 'U'

)      

SELECT TOP 1 * FROM TableListName

WHERE RowNum = CAST(RAND()*(SELECT MAX(RowNum)-1 as MaxRowNum

                                FROM TableListName) AS INT)+1

 

 

2.       TableName 변수를 이용해서 데이터를 읽어오는 작업을 설정합니다. SQL 실행 작업에서 탭에서 SqlStatementSource에 대해 다음과 같은 식을 설정합니다.

“SELECT * FROM “ + @[사용자::TableName]

 

 

 

ResultSet전체 결과 집합으로 설정하고, 결과 집합 탭에서 결과를 지정할 변수를 지정합니다. 본 예제에서는 Email_CurrentDataset 이라는 Object형 변수를 사용합니다.

 

3.       스크립트 작업을 추가한 후, ReadOnlyVariables 속성에 위에서 설정한 Email_CurrentDataSet 변수와 TableName 변수를 지정하고 VSA를 엽니다.

 

4.       VSA의 상단 메뉴에서 프로젝트(P) -> 참조 추가(R)를 선택한 후, System.Xml.dll 을 추가합니다.

 

5.       다음과 같은 스크립트를 입력합니다.

Imports System

Imports System.Data

Imports System.Math

Imports Microsoft.SqlServer.Dts.Runtime

Imports System.IO

 

Public Class ScriptMain

 

    Public Sub Main()

        Dim str As String

        Dim colidx As Integer

        Dim tableName As String

        Dim oLead As New Data.OleDb.OleDbDataAdapter

        Dim dt As New Data.DataTable

        Dim dr As System.Data.DataRow

        Dim WriteToFile As StreamWriter

 

        tableName = Dts.Variables("TableName").Value.ToString

        WriteToFile = File.CreateText("D:\" & tableName & ".txt")

 

        Try

            oLead.Fill(dt, Dts.Variables("Email_CurrentDataset").Value)

            For Each dr In dt.Rows

                str = ""

                For colidx = 0 To dt.Columns.Count - 1

                    If colidx < dt.Columns.Count - 1 Then

                        str &= dr.Item(colidx).ToString & vbTab

                    Else

                        str &= dr.Item(colidx).ToString & vbCrLf

                    End If

                Next

                WriteToFile.Write(str)

            Next

 

            WriteToFile.Close()

            Dts.TaskResult = Dts.Results.Success

 

        Catch ex As Exception

            Dts.TaskResult = Dts.Results.Failure

        End Try

    End Sub

End Class

AdventureWorks에서 임의의 테이블을 선택한 다음 D:\ Tab 구분자로 설정된 데이터 파일로 출력합니다.

 

6.       패키지를 여러 번 실행시킨 후, 실행된 결과를 확인합니다.

 

 

 

Ex) HumanResources.Shift.txt

 

Ex) Production.TransactionHistory.Achive.txt

 

 

 

본 방식은 필자가 개인적으로 오랫동안 구현하고자 했던 내용입니다.

비록 스크립트 작업을 이용한 처리 방식이지만 『SSIS에서 동적 결과 처리를 할 수 있다』라는 점에서 매우 유용한 예제라 생각됩니다. 이러한 방식을 다음과 같은 형태의 작업에도 이용할 수 있습니다.

 

         테이블 결과를 메일의 내용으로 출력해야 할 경우 파일에 쓰는 대신 문자열 변수에 저장하도록 스크립트를 변경한 다음, 메일 보내기 작업에서 내용 부분에 이 변수를 지정합니다.

 

         여러 테이블을 파일로 출력 - 파일 이름을 랜덤으로 획득하는 부분 대신, Foreach 루프 컨테이너를 사용해서 여러 테이블 또는 전체 테이블에 대해 파일 백업이나 엑셀 파일로 출력하는 기능을 구현할 수 있습니다.

 

반응형
반응형

데이터 가져오기/내보내기에서의 텍스트 파일 Null 처리 문제

 

 

한대성

MS SQL Server MVP

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

 

 

[질문]

SQL 2005 에서 DTS 수행시 엑셀 파일이면 상관이 없는데 텍스트나 CSV파일이면 날짜 형식(smalldatetime) null 값이 있으면 가져오기가 되지 않습니다.

 

이 부분에 대해 해결할 방법이 없을까요?

 

 

다음과 같은 데이터를 SQL 2005데이터 가져오기/내보내기를 이용해서 가져올 때 발생할 수 있는 문제입니다.

 

[데이터 원본]

1.     엑셀 파일

 

2.     텍스트 파일 or CSV 파일

 

 

[데이터 대상]

CREATE TABLE DateTarget

(

       InputDate smalldatetime NULL

)

GO

 

 

, Null이 포함된 입력 데이터를 smalldatetime 형태의 Null이 허용되는 테이블로 넣는 작업을 수행할 때, Excel 파일은 문제없이 수행되나 텍스트 파일이나 CSV 파일일 경우에는 에러가 발생합니다. 

 

 

 

 

 

이런 에러가 발생하는 원인은 다음과 같은 점 때문입니다.

 

1.     Excel 파일을 읽어오는 Jet Engine Data Provider는 빈 값을 Null로 처리해서 가져옵니다. 따라서 입력 데이터 중에 Null이 포함되더라도 대상 테이블이 Null 허용이면 에러 없이 처리됩니다.

 

2.     텍스트 파일(또는 CSV 파일)은 기본값으로 빈 값을 Null로 간주하지 않습니다. 빈 값을 대상 테이블의 유형에 맞게 자동으로 변경합니다. 이 때 변환하는 값은 도구에 따라 차이가 있습니다.

예를 들어 다음과 같이 쿼리 분석기에서 수행할 경우, 빈 값은 ‘1900-01-01 00:00:00’의 값으로 변환합니다.

CREATE TABLE DateTarget

(

        InputDate smalldatetime NULL

)

GO

 

INSERT DateTarget VALUES ('')

GO

 

SELECT * FROM DateTarget

/*

InputDate

-----------------------

1900-01-01 00:00:00

*/

 

SQL 2000 DTS에서는 기본값으로 빈 값을 Null로 간주합니다. 따라서, 텍스트 파일이 빈 값일 경우에는 Null로 처리됩니다.

 

하지만, 데이터 가져오기/내보내기를 수행하는 SSIS 엔진에서는 다른 값으로 처리합니다.

 

, SSIS에서는 빈 값을 ‘1899-12-30 오전 12:00:00’으로 변환하게 됩니다.

 

 

 

datetimesmalldatetime의 데이터 범위를 잠시 살펴보겠습니다. 

 

 

에러가 발생하는 원인은 바로 여기에 있습니다. SSIS에서 빈 값을 ‘1899-12-30’으로 변형한 후에 smalldatetime 열에 입력을 하려고 하지만, smalldatetime의 데이터 범위 밖의 숫자이기 때문에 위와 같은 에러가 발생합니다.

 

 

이러한 문제를 해결하기 위해서는 다음과 같은 방법을 사용하시기 바랍니다.

 

방법 1. 텍스트 파일 또는 CSV 파일이면서 Null이 포함된 데이터인 경우, 쿼리 분석기에서 BULK INSERT 명령을 이용하시기 바랍니다.

BULK INSERT DateTarget FROM 'D:\Date.txt'

WITH (FIRSTROW=2) 열 머리글이 포함된 경우

GO

 

 

방법 2. 대상 테이블의 열을 smalldatetime 대신 datetime으로 변경하고 작업 처리 후에 ‘1899-12-30’으로 입력된 값을 Null로 변경하는 작업을 수행합니다.

 

 

방법 3. 데이터 가져오기 작업을 즉시 실행하는 대신 SSIS 패키지로 저장한 다음, 이 패키지를 편집 모드로 열어서 다음과 같은 수정 작업을 수행합니다. 편집 모드로 열려면 패키지 파일을 선택한 다음, 마우스 오른쪽 버튼을 클릭해서 나타나는 메뉴 중, 편집을 선택하면 됩니다. 이 경우, 프로젝트 없이 패키지만 여는 것이기 때문에 패키지를 수정할 수는 있지만, 디버깅이나 실행할 수는 없습니다.

 

 

 

 

플랫 파일 원본 편집기 내에 있는 원본의 Null 값을 데이터 흐름의 Null 값으로 유지(R) 옵션을 체크하고 저장한 다음, 패키지를 실행합니다. 패키지 파일을 더블 클릭하면 자동으로 패키지 실행 유틸리티인 DTEXECUI가 실행됩니다.

 

 

 

 

데이터 가져오기/내보내기 기능에서 위와 같이 Null 값을 유지하는 옵션이 있다면 이와 같은 번거로운 작업을 수행하지 않아도 되지만, 유감스럽게도 아직까지는(SP2) 이 옵션이 포함되어 있지 않습니다.

 

 

참고하시기 바랍니다.

반응형
반응형


2007년 3월 10일 부터 23일까지 진행하였던 SSIS  실습 강좌를 하나의 파일로 묶었으며, 일부 정리하였습니다.
 
필요하신 분은 다운 받으셔서 이용하시기 바랍니다.^^
반응형
반응형


UNION ALL 및 병합 변환 구현 예제

 

 

한대성

MS SQL Server MVP

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

 

  [질문]

다음과 같은 입력 테이블에 대해, 아래와 같은 출력을 구현하고자 합니다.

테이블 A

ID

name1

mail1

birthDay1

BBB

보아

b@b.b

19990101

EEE

설운도

e@e.e

20050102

 

테이블 B

ID

name2

mail2

birthDay2

AAA

성유리

a@a.a

20001001

BBB

이효리

c@c.c

20010201

DDD

홍길동

z@z.z

20001001

EEE

김이지

f@f.f

20070205

 

테이블 C

ID

name3

mail3

birthDay3

CCC

윤은혜

d@d.d

19990215

EEE

이영애

l@l.l

19970520

 

출력 형태

ID

name1

mail1

birthDay1

name2

mail2

birthDay2

name3

mail3

birthDay3

AAA

성유리

a@a.a

20001001

 

BBB

보아

b@b.b

19990101

이효리

c@c.c

20010201

 

CCC

윤은혜

d@d.d

19990215

DDD

홍길동

z@z.z

20001001

 

EEE

설운도

e@e.e

20050102

김이지

f@f.f

20070205

이영애

l@l.l

19970520

우선 결과값 형태로 출력되어지기 위해서는 테이블 A, B, C 이외에도 ID를 모두 가지고 있는 테이블이 하나 더 필요합니다.  

, 다음과 같은 테이블 입니다..

ID

AAA

BBB

CCC

DDD

EEE

 

이 테이블을 기준으로 테이블 A에서 name1, mail1, …, 테이블 B에서 name2, mail2,…, 테이블 C에서 name3, mail3, … 열을 병합 조인하는 방식으로 처리하면 원하는 결과가 나올 것 같네요.

 

위와 같이 고유한 ID로 이루어진 집합을 만드는 방법부터 먼저 설명하겠습니다.

우선 테이블 A, B, C의 값들은 ID 테이블을 생성할 때에도 쓰이고, 병합 조인을 할 때에도 쓰일 것이기 때문에 각각의 입력에 대해 멀티캐스트를 설정합니다.

 

우선 테이블 A, B, C에서 ID을 결합하는 UNION ALL ID 변환을 설정합니다.

그런 다음, 고유한(Unique) 값을 추출해 내기 위해 정렬 변환을 추가하고, 다음과 같이 설정합니다.

이 때, 아래 그림과 같이 중복되는 정렬 값이 있는 행 제거라는 옵션을 체크해 줍니다.

 

 

, 이제 고유한(Unique) ID로 구성된 하나의 집합이 만들어졌습니다. 이제 병합 조인을 수행해야 합니다. 하지만, 병합 조인은 다음과 같은 두 제약 조건이 있습니다.

a.     병합 조인은 두 개의 입력만 가능합니다.

b.     각각의 입력은 정렬되어야 합니다.

 

우선, ID열의 입력은 정렬되었기 때문에, 테이블 A 데이터를 ID열로 정렬하도록 합니다.(<1>)

 

 

그런 다음 병합 조인 변환을 추가한 후, 정렬 ID의 출력과 정렬 A의 출력을 연결합니다. (<2>) 이때, 정렬 ID 출력이 기본이며, 정렬 A의 출력이 왼쪽 우선 외부조인으로 설정되어야 합니다.

 

 

이와 비슷한 방식으로 데이터 B, 데이터 C에 대해서도 정렬을 설정하고 병합 조인을 연결시킵니다.

이 때, 조인 유형을 왼쪽 우선 외부 조인으로 설정하는 것을 주의하시기 바랍니다.

 

 

 

 

만들어진 패키지는 다음과 같습니다.

 

 

데이터 뷰어 또는 다른 데이터 대상을 이용해서 출력되는 결과를 확인해 봅시다.

 

 

 

반응형
반응형


WMI 이벤트 감시자를 이용한 CPU 사용률 모니터링 시스템 구현

 

한대성

MS SQL Server MVP

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

 

 

SSIS 패키지는 데이터베이스와 관련된 데이터 처리, 이관, 변환 작업뿐만 아니라 다양한 형태의 배치 작업과 모니터링 작업을 수행할 수 있습니다. 이번 글에서는 SSIS에 포함된 작업 개체 중, WMI(Windows Management Instrumentation)과 관련된 작업 개체인 WMI 이벤트 감시자 작업, WMI 데이터 판독기 작업을 이용한 CPU 모니터링 패키지를 구현해 보도록 하겠습니다.

 

구현할 내용은 다음과 같습니다.

서버의 CPU 사용률(% Processor Time) 70% 이상인 경우, 현재 수행중인 모든 프로세스의 정보를 파일로 기록

 

SSIS 패키지는 WMI 이벤트 감시자 작업을 이용해서 서버의 CPU 사용률이 70% 이상일 경우에 발생되는 이벤트를 기다리다가 해당 이벤트가 발생되면, 사용자가 설정한 로그 기록 작업을 수행하는 방식입니다.

 

1.      빈 패키지를 연 다음, 연결 관리자에서 모니터링 할 서버에 대한 WMI 연결을 추가합니다.

 

 

2.      제어 흐름 영역WMI 이벤트 감시자를 추가하고, 다음과 같은 WQL 쿼리를 입력합니다.

SELECT * FROM __InstanceOperationEvent WITHIN 1

WHERE TargetInstance ISA "Win32_PerfFormattedData_PerfOS_Processor"

and TargetInstance.PercentProcessorTime >=70

 

[참고]

WMI 개체는 OS에 따라 약간씩 차이가 있습니다. 예를 들어, 본 예제에서 사용하는 Win32_PerfFormattedData_PerfOS_Processor Windows Server 2000에는 없는 개체입니다.

 

 

AfterEvent 부분을 이벤트 다시 감시로 설정합니다. 이벤트가 발생한 후에도 다시 감시하도록 설정하는 것입니다.

 

3.      이제 이벤트가 발생(=CPU의 사용률이 70% 이상)했을 때 작업을 수행하는 부분을 구현합니다. WMI 이벤트가 발생하게 되면 SSIS 이벤트 중 WMIEventWatcherEventOccurred 라는 이벤트를 발생시킵니다. 따라서, 이벤트 처리기의 WMIEventWatcherEventOccurred를 선택합니다.

 

운영체제에서 실행 중인 프로세스 정보를 저장할 파일을 설정합니다. 연결 관리자에서 새 파일 연결(F)를 선택한 후, 사용 유형(U)파일 만들기로 변경하고 적절한 파일명을 입력합니다.

[참고]

본 예제에서는, 이 연결의 이름을 PerfLog_Process로 변경하였습니다.

 

만약, 파일 명 뒤에 날짜 정보를 추가하고 싶을 경우, 추가한 파일 연결을 선택한 후, 속성 부분의 Expression에서 다음과 같은 식(Expression)을 설정합니다.

 

[ConnectionString 속성에 대한 식]

"D:\\PerfLog_Process_" + SUBSTRING(REPLACE(REPLACE(REPLACE(REPLACE((DT_WSTR,32)(GETDATE()), "-",""),":",""), " ", ""), ".",""), 1, 20) + ".log"

 

 

4.      이벤트 처리기로 돌아온 다음, WMI 데이터 판독기 작업을 추가하고 다음과 같이 설정합니다.

   WqlQuerySource

SELECT ElapsedTime, IDProcess, Name, PageFileBytes, ThreadCount, VirtualBytes, WorkingSet

FROM Win32_PerfFormattedData_PerfProc_Process

   OutputType                     데이터 테이블

   OverwriteDestination         대상 덮어쓰기

   DestinationType               파일 연결

   Destination                       - PerfLog_Process

 

5.      패키지를 실행시킵니다. CPU의 사용률이 설정한 수치보다 낮을 경우에는 다음과 같이 노란 색으로 대기하게 됩니다.

 

6.      CPU 사용률이 높을 경우, 다음과 같이 이벤트 처리기에서 정의한 작업이 수행됩니다.

 

 

 

 

 

이 외에도 이벤트 처리기에서 SQL 실행 작업이나 데이터 흐름 작업 등을 이용하여 현재 수행중인 쿼리들의 정보를 파일로 기록하도록 하거나 메일 보내기 작업, 프로세스 실행 작업 등을 이용하여 관리자에게 통보하도록 하는 기능들을 추가할 수 있습니다.

 

[참고]

         수집하는 시간 간격을 조절하기 위해서는 2단계의 __InstanceOperationEvent WITHIN 1 값을 1에서 다른 값으로 변경하면 됩니다.

 

         프로세스 정보를 직접 파일에 쓰는 대신, Object 형 변수에 저장시킨 후, 이를 테이블이나 다른 형태의 파일로 출력할 수 있습니다.

 

         4단계에서 WQL 쿼리의 열 순서를 변경하더라도 출력되는 파일의 열 순서는 변경되지 않습니다. ,

                SELECT Name, ThreadCount, ElapsedTime, IDProcess, PageFileBytes, VirtualBytes,

                 WorkingSet FROM Win32_PerfFormattedData_PerfProc_Process

형태로 조회를 하더라도 출력되는 데이터는 위와 같이 열의 이름 순서대로 출력됩니다.

 
  
반응형
반응형

10SQL Agent 등록 및 모니터링, 속성 설정하기

 

한대성 (admin@sqlleader.com)

에이디컨설팅 / 책임 컨설턴트

SQLLeader.com / 운영자

 

 

이제 본 실습 강좌의 마지막 강좌입니다. 이번 강좌에서는 만들어진 패키지를 SQL Agent에 등록하고, 연결 정보를 관리하는 구성 파일을 이용하여 지정하는 것에 대해 설명하겠습니다.

 

이번 강좌에서 다룰 내용은 이미 기존에 몇 번 다룬 내용이라 특별히 새로운 내용은 없지만, 복습 차원에서 다시 살펴보는 기회라 생각해 주시기 바랍니다.

 

SQL Server Management StudioSQL Server 에이전트에서 새로운 작업을 추가합니다.

 

 

 

작업의 이름을 임의로 지정하고, 단계 탭에서 새로 만들기(N)을 클릭해서 새로운 작업 단계를 추가합니다.

 

단계 이름 역시 임의로 지정하고, 유형(T)SQL Server Integration Services 패키지로 설정하면 다음과 같이 패키지를 지정할 수 있는 형태로 변경됩니다.

 

 

 

패키지 원본 부분을 파일 시스템으로 변경한 후, 패키지 부분에 9강에서 만든 패키지를 지정합니다. 이 때, 패키지 파일(.dtsx)을 다른 위치로 복사한 후 이를 지정해 줘도 됩니다.

 

 

다른 탭은 그대로 두고 확인 버튼을 눌러 작업 설정 창을 닫고, 다시 확인 버튼을 눌러 실행 작업 설정을 마칩니다. 이제 예약 일정은 없지만 SSIS 패키지를 실행하는 간단한 패키지 실행 작업이 완성되었습니다.

 

실제 환경에서는 패키지가 수행될 일정이나 작업 통보, 실행 기록을 저장할 파일 설정 등을 해 줘야 합니다.

 

새로 추가한 작업을 수동으로 실행시켜 봅니다.

 

 

 

 

 

 

연결 정보 구성 설정하기

메모장이나 텍스트 편집기에 다음과 같은 두 개의 XML 파일 구성 파일을 만듭니다.

 

D:\ DBConn.dtsconfig

 

<?xml version="1.0"?>
  <DTSConfiguration>
  <DTSConfigurationHeading>
    </DTSConfigurationHeading>
    <Configuration ConfiguredType="Property"
 Path="\Package.Connections[WebLogTargetTable].Properties[ConnectionString]"
 ValueType="String">
      <ConfiguredValue>Data Source=localhost;Initial Catalog=tempdb;Provider=SQLNCLI.1;Integrated Security=SSPI;Auto Translate=False; </ConfiguredValue>
    </Configuration>
  </DTSConfiguration>

 

D:\FileLocation.dtsconfig

 

<?xml version="1.0"?>
  <DTSConfiguration>
    <DTSConfigurationHeading>
      <DTSConfigurationHeading>
      </DTSConfigurationHeading>
    <Configuration ConfiguredType="Property"
     Path="\Package.Connections[WebLogBackupFile].Properties[ConnectionString]"
     ValueType="String">
      <ConfiguredValue>D:\WebLogBackup.bak</ConfiguredValue>
    </Configuration>
    <Configuration ConfiguredType="Property"
     Path="\Package.Connections[WebLogSourceFile].Properties[ConnectionString]"      ValueType="String">
      <ConfiguredValue>D:\SSIS\Data\ex070217.log</ConfiguredValue>
    </Configuration>
  </DTSConfiguration>

 

 

첫 번째 파일은 패키지에서 사용하는 DB 연결(WebLogTargetTable)에 대한 설정 파일이며, 두 번째 파일은 파일 연결 정보(WebLogSourceFile, WebLogBackupFile)에 대한 설정 파일입니다.

 

이러한 구성 파일들을 패키지 외부에 별도로 만들어둔 후, 패키지를 실행할 때 이용하도록 할 수 있으며, 하나의 구성 파일을 여러 패키지에서 사용할 수도 있습니다.

 

SQL Agent에 등록된 SSIS 작업 중 구성 부분에서 이러한 설정 파일을 지정합니다.

 

 

만약, 패키지를 수행할 때 사용하는 DB 정보나 파일의 위치를 변경하고자 할 경우, 패키지를 열어서 수정하고 다시 저장하는 단계 없이 위의 구성 파일(DBConn.dtsconfig, FileLocation.dtsconfig)만 간단히 수정하면 됩니다. (참고로 구성 파일의 확장자는 반드시 .dtsconfig일 필요는 없습니다.)

 

 

 

 

패키지의 속성 값 설정

 

연결 정보 외에 패키지 내에 있는 변수의 값과 같은 속성 값을 변경해야 할 경우가 있습니다. 예를 들어, 예제 패키지 중 ExecDate 변수의 값을 변경해서 실행하고자 할 경우입니다.

 

 

SQL Agent에 등록된 SSIS 작업 중 값 설정 부분에서 이러한 설정을 수행할 수 있습니다.

속성 경로에 다음과 같이 입력하고, 값 부분에는 지정할 일자 값을 입력합니다.

 

속성 경로

\Package.Variables[사용자::ExecDate].Properties[Value]

20070219

 

 

 

본 강좌에 실린 글은 누구나 복사하셔서 이용하셔도 되지만, 반드시 출처(SQLLeader.com) 및 링크를 밝혀주셔야 합니다.

 

 

 

 

 

강좌를 마치며

 

SSIS를 주제로 세미나나 교육, 컨설팅을 수행하면서 자주 요구 받았던 사항이 처음부터 끝까지한 번 쭉 다루어 달라는 것이었습니다. , 패키지를 만들기 위한 구성부터 작성, 모니터링, 설정, 관리 등의 전반적인 작업을 간단히 설명해 달라는 요청입니다.

 

이러한 점을 목표로 업무 주제를 정하고 준비부터 예약 작업까지를 다루는 실습 중심의 강좌를 목표로 본 강좌를 작성하게 되었습니다. 아직 내용을 전달하는 실력이 많이 부족하고 급하게 작성하다 보니 사족과 같이 불필요한 말이나 구어체 표현이 많이 포함되어 역시나 이전과 같이 말끔하지 못한 강좌로 끝마치게 된 것 같습니다.

 

하지만, 본 강좌가 수익을 목표로 하는 강좌가 아니고, 외부의 압력(^^)에 의해서 진행한 강좌가 아니라, 제가 그냥 쓰고 싶고, 몇 사람에게라도 도움을 드리고자 하는 의도로 작성한 것이기에 이러한 부족한 부분들을 다 이해해 주시고 편히 읽어주시기 바랍니다.

 

앞으로도 더 공부하고 익히고 경험해서 좋은 주제로 보다 더 좋은 방법으로 지식을 전달할 수 있도록 노력하겠습니다.

 

감사합니다.. 꾸벅..

2007 3

에이디 컨설팅

한대성 드림

 

반응형
반응형


9강 작업 종료 및 실패 시 메일 통보 설정

 

한대성 (admin@sqlleader.com)

에이디컨설팅 / 책임 컨설턴트

SQLLeader.com / 운영자

 

 

이번 강좌에서는 패키지가 정상적으로 종료되거나 실패할 경우, 관리자나 담당자에게 메일을 발송하는 기능을 구현해보도록 하겠습니다.

 

메일 발송 기능은 SSIS에서 기본적으로 제공해주는 기능으로 하나의 강좌로 다룰 만큼의 분량이 되는 기능은 아닙니다. SMTP 연결 관리자를 추가하고, 이미 8강에서 다루었던 이벤트 처리기를 이용해서 발송할 메일을 설정해 주면 되는 것입니다.

 

하지만, 이렇게 별도의 강좌로 분리한 이유는 다음과 같습니다.

a.      SSIS에서 기본적으로 제공해주는 SMTP 연결은 인증 없음 또는 Windows 인증에 대해서만 설정 가능합니다. 예를 들어, GMail이나 로그인을 필요로 하는 SMTP 서버를 이용하고자 할 경우에는 설정할 수가 없습니다. 이에 대한 설정 방법을 다룰 것입니다.

b.      SSIS의 메일 보내기 기능은 텍스트 형태로만 발송됩니다. 기존의 DTS에 비해 MAPI가 아닌 SMTP 연결을 이용한다는 장점은 있지만, 텍스트 형태의 메일만 발송할 수 있다는 제약 사항이 있습니다. 본 강좌에서는 스크립트 작업을 이용한 HTML 메일 발송을 구현합니다.

 

 

8강까지 구성한 패키지를 엽니다.

 

제어 흐름에서 두 개의 변수를 추가합니다. ReadCnt WriteCnt라는 이름의 Int32형 변수입니다. 이 변수는 파일로부터 읽어온 행 수와 테이블에 저장한 행 수를 보관하는 용도로 이용할 것입니다.

 

 

이제 WebLog 데이터 로딩 작업을 더블 클릭해서 데이터 흐름 영역을 연 다음, WebLogFile 원본과 조건부 분할, 멀티캐스트WebLogTable 대상 사이에 행 개수 변환을 각각 추가합니다.

 

 

윗 쪽에 있는 행 개수 변환을 더블 클릭해서 편집기를 연 다음, VariableName 속성에 추가한 사용자::ReadCnt변수를 지정하고, 아래 쪽에 있는 행 개수 변환에는 사용자::WriteCnt변수를 지정합니다.

 

 

 

이제, 데이터가 처리될 때 입력되는 행 수는 ReadCnt에 저장이 되고, 테이블에 저장되는 행 수는 WriteCnt 변수에 저장될 것입니다.

 

제어 흐름을 선택한 후, 다음과 같은 변수를 추가합니다.

이름

범위

데이터 형식

MessageFrom

WebLogLoading

String

admin@sqlleader.com

MessageTo

WebLogLoading

String

dshan@adconsulting.co.kr

SMTPServer

WebLogLoading

String

smtp.gmail.com

SMTPLogin

WebLogLoading

String

admin@sqlleader.com

SMTPPasswd

WebLogLoading

String

********

 

값 부분은 테스트 환경에 맞게 변경해서 지정하시기 바랍니다.

 

 

이벤트 처리기OnPostExecute 이벤트를 선택한 후, 스크립트 작업을 추가한 후, 기존에 추가한 로그 기록 작업과 연결시키고 작업의 이름을 메일 발송으로 변경합니다.

로그 기록 작업과 메일 발송 작업을 연결하는 연결선을 더블 클릭하여 선행 제약 조건 편집기를 연 다음, 평가 작업으로 변경하고 (X) 부분에 다음과 같은 조건 식을 입력합니다.

 

             @[System::PackageID] == @[System::SourceID]

 

 

OnPostExecute 이벤트 중에서 작업 개체의 완료가 아닌 패키지의 완료일 때에만 메일 발송 작업이 실행되도록 설정한 것입니다.

 

메일 발송 스크립트 작업을 더블 클릭하여 작업 편집기를 연 다음, 스크립트 탭의 ReadOnlyVariables 부분에 다음과 같은 속성을 입력합니다.

 

MessageFrom,MessageTo,SMTPServer,SMTPLogin,SMTPPasswd,ReadCnt,WriteCnt

속성을 입력할 때 [,] 사이에 공백을 넣지 않도록 주의하시기 바랍니다.

 

 

이제, 아래 부분에 있는 스크립트 디자인(S) 버튼을 클릭하여 VSA(Visual Studio for Application)을 연 후, 다음과 같은 스크립트를 입력합니다.

 

Imports System

Imports System.Data

Imports System.Math

Imports System.Net

Imports System.Net.Mail

 

Imports Microsoft.SqlServer.Dts.Runtime

 

Public Class ScriptMain

 

    Public Sub Main()

 

        Dim htmlMessageTo As String = Dts.Variables("MessageTo").Value.ToString

        Dim htmlMessageFrom As String = Dts.Variables("MessageFrom").Value.ToString

        Dim htmlMessageSubject As String = "SSIS 예제 작업 완료 통보 메일[" & Date.Today.ToString & "]"

        Dim smtpServer As String = Dts.Variables("SMTPServer").Value.ToString

        Dim smtpLogin As String = Dts.Variables("SMTPLogin").Value.ToString

        Dim smtpPasswd As String = Dts.Variables("SMTPPasswd").Value.ToString

 

        Dim htmlMessageBody As String

 

        htmlMessageBody = "<H1>작업 완료 통보 메일</H1><BR>" & _

            " <li> 입력 행수: " & Dts.Variables("ReadCnt").Value.ToString & "<BR>" & _

            " <li> 출력 행수: " & Dts.Variables("WriteCnt").Value.ToString & _

           " <BR><BR>" & _

            " <font style='font:9pt Arial;font-weight:bold;'>SQLLeader.com</font>"

 

        SendMailMessage( _

            htmlMessageTo, htmlMessageFrom, _

            htmlMessageSubject, htmlMessageBody, _

            True, smtpServer, smtpLogin, smtpPasswd)

 

        Dts.TaskResult = Dts.Results.Success

 

    End Sub

 

    Private Sub SendMailMessage( _

        ByVal SendTo As String, ByVal From As String, _

        ByVal Subject As String, ByVal Body As String, _

        ByVal IsBodyHtml As Boolean, ByVal Server As String, _

        ByVal Login As String, ByVal Passwd As String)

 

        Dim htmlMessage As New MailMessage

        Dim mySmtpClient As SmtpClient

        Dim fromAddress As MailAddress

        Dim toAddress As MailAddress

        Dim fromAddrStr As String()

        Dim toAddrStr As String()

 

 

        fromAddrStr = From.Split(CChar(" "))

        toAddrStr = SendTo.Split(CChar(" "))

 

 

        If fromAddrStr.GetUpperBound(0) > 0 Then

            fromAddress = New MailAddress(fromAddrStr(1), fromAddrStr(0))

        Else

            fromAddress = New MailAddress(fromAddrStr(0))

        End If

 

        If toAddrStr.GetUpperBound(0) > 0 Then

            toAddress = New MailAddress(toAddrStr(1), toAddrStr(0))

        Else

            toAddress = New MailAddress(toAddrStr(0))

        End If

 

        With htmlMessage

            .From = fromAddress

            .To.Insert(0, toAddress)

            .Subject = Subject

            .Body = Body

            .IsBodyHtml = IsBodyHtml

 

        End With

 

        mySmtpClient = New SmtpClient(Server)

        mySmtpClient.EnableSsl = True  ' SSL 연결을 사용할 경우 환경에 따라 변경하세요.

        mySmtpClient.Port = 25 ' SMTP 포트 / 환경에 따라 변경하세요.

        mySmtpClient.Credentials = New NetworkCredential(Login, Passwd)

        mySmtpClient.Send(htmlMessage)

 

    End Sub

 

End Class

 

 

패키지를 실행해서 메일이 정상적으로 발송되는지 확인합니다.

 

 

 

메일 발송 스크립트 작업을 복사한 후, 이벤트 처리기OnError 이벤트 영역에 붙여 넣습니다.

 

 

메일 발송 작업을 더블 클릭해서 편집기를 연 다음, 스크립트 탭의 ReadOnlyVariables 부분 중 ReadCnt,WriteCnt 변수 대신 ErrorCode,ErrorDescription을 추가합니다.

 

MessageFrom,MessageTo,SMTPServer,SMTPLogin,SMTPPasswd,ErrorCode,ErrorDescription

 

 

스크립트 디자인(S)를 클릭하여 VSA를 연 다음, 다음과 같이 Sub Main() 부분을 일부 변경하고 VSA를 닫습니다.

Public Sub Main()

 

        Dim htmlMessageTo As String = Dts.Variables("MessageTo").Value.ToString

        Dim htmlMessageFrom As String = Dts.Variables("MessageFrom").Value.ToString

        Dim htmlMessageSubject As String = "SSIS 예제 에러 발생 통보 메일[" & Date.Today.ToString & "]"

        Dim smtpServer As String = Dts.Variables("SMTPServer").Value.ToString

        Dim smtpLogin As String = Dts.Variables("SMTPLogin").Value.ToString

        Dim smtpPasswd As String = Dts.Variables("SMTPPasswd").Value.ToString

 

        Dim htmlMessageBody As String

 

        htmlMessageBody = "<H1>에러 발생 통보메일</H1><BR>" & _

            " <li> 에러코드: " & Dts.Variables("ErrorCode").Value.ToString & "<BR>" & _

            " <li> 에러사유: " & Dts.Variables("ErrorDescription").Value.ToString & _

           "<BR><BR>" & _

            " <font style='font:9pt Arial;font-weight:bold;'>SQLLeader.com</font>"

 

        SendMailMessage( _

            htmlMessageTo, htmlMessageFrom, _

            htmlMessageSubject, htmlMessageBody, _

            True, smtpServer, smtpLogin, smtpPasswd)

 

        Dts.TaskResult = Dts.Results.Success

 

    End Sub

 

이제, 제어 흐름에 임의로 에러를 발생시키는 작업을 추가한 후, 패키지를 실행해 봅니다. 본 예제에서는 임의 에러 발생이라는 SQL 실행 작업을 추가한 후, Connection을 지정하고 SELECT 1/0 이라는 쿼리를 이용하여 0으로 나누기로 인한 오류가 발생하도록 설정하였습니다.

 

 

 

 

 

 

 

위의 작업들을 적절히 잘 활용하여 작업 결과나 에러 통보를 효과적으로 알려주는 모니터링 프로세스를 쉽게 구현할 수 있습니다.

 

반응형
반응형


8강 커스터마이징 작업 로그 설정

 

한대성 (admin@sqlleader.com)

에이디컨설팅 / 책임 컨설턴트

SQLLeader.com / 운영자

 

 

SSIS에서는 기본적으로 다양한 형태의 로깅 기능을 제공합니다.

 

 

이러한 기능을 이용해서 패키지가 수행되는 상태를 기록하고 관리하는 것이 간단하기는 하지만, 이번 강좌에서는 이벤트 처리기를 이용하여 원하는 형태의 로깅 정보를 관리하는 프로세스를 구현해 보도록 하겠습니다.

 

 

7강에서 만들었던 패키지를 이용하여 진행하도록 하겠습니다.

 

웹 로그 테이블이 만들어진 DB에 다음과 같은 쿼리를 실행시켜 로깅 정보를 저장할 테이블을 만듭니다.

 

if exists (select * from dbo.sysobjects where id = object_id(N'[PackageHistory]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)

drop table [PackageHistory]

GO

 

CREATE TABLE [dbo].[PackageHistory](

        SEQ bigint identity(1,1) NOT NULL,

        [PackageID] uniqueidentifier not null,

        [PackageName] [nvarchar](255)NOT NULL,      

        [ExecStartTime] [datetime] NULL,

        [ExecEndTime] [datetime] NULL,

        [Status] char(1) NOT NULL DEFAULT('N')

        CONSTRAINT [pk__PackagehISTORY] PRIMARY KEY CLUSTERED (

        SEQ ASC, PackageName

        )

) ON [PRIMARY]

GO

 

CREATE INDEX IDX_PackageHistory ON PackageHistory(PackageID, PackageName)

GO

 

 

if exists (select * from dbo.sysobjects where id = object_id(N'[TaskHistory]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)

drop table [TaskHistory]

GO

 

CREATE TABLE [dbo].[TaskHistory](    

        [SEQ] bigint identity not null,

        [PackageID] uniqueidentifier not null,

        [PackageName] [nvarchar](255)NOT NULL,      

        [TaskID]  uniqueidentifier not null,

        [TaskName] [nvarchar](255)NOT NULL,  

        [ExecStartTime] [datetime] NULL,

        [ExecEndTime] [datetime] NULL,

        [Status] char(1) NOT NULL DEFAULT('N')

        CONSTRAINT [pk__TaskHistory] PRIMARY KEY CLUSTERED (

        SEQ

        )

) ON [PRIMARY]

GO

 

CREATE INDEX IDX_TaskHistory ON TaskHistory(PackageID, TaskID)

GO

 

PackageHistory 테이블은 패키지가 시작하고 종료할 때의 정보를 기록하는 테이블이며, TaskHistory 테이블은 패키지 내의 개별 작업들이 시작하고 종료될 때의 정보를 기록하는 테이블입니다.

 

※ 참고

패키지 정보와 작업 개체 정보의 로그를 하나의 테이블로 관리해도 되지만, 실제 작업을 모니터링 할 때, 패키지 전체의 성공여부를 확인한 후 문제가 있는 경우에 세부 작업에 대한 정보를 확인하는 행태에 따라 이렇게 분리하였습니다.

테이블 구조는 필요에 따라 다양하게 변경하여 사용할 수 있습니다.

 

패키지에서 이벤트 처리기 탭을 클릭한 후, OnPreExecute 이벤트()를 선택하고 작업 영역을 클릭하여 새로운 이벤트 처리 영역() 을 추가합니다. 이 때, 실행 파일 부분은 패키지 전체 수준으로 설정되었는지를 확인합니다.()

 

 

OnPreExecute 이벤트 처리기 영역에 SQL 실행 작업을 하나 추가하고, 이름을 로그 입력으로 변경합니다. 위의 그림에서 이벤트 처리기의 범위를 지정하는 실행 파일() 부분이 패키지 최상위로 선택되어 있기 때문에 로그 입력 작업은 패키지가 시작되거나 패키지 내의 개별 작업 개체 또는 컨테이너가 시작될 때 모두 호출됩니다.

 

작업 편집기에서 ConnectionWebLogTargetTable DB로 지정합니다. 일반적으로 로깅 정보를 저장하는 DB는 운영 DB와 분리해서 관리하지만, 본 예제에서는 편의상 웹 로그 테이블이 저장되는 DB와 동일한 DB로 사용하도록 하겠습니다.

 

SqlStatement에 다음과 같은 쿼리를 입력합니다.

 

DECLARE @PackageID nvarchar(50), @PackageName nvarchar(255), @TaskID nvarchar(50), @TaskName nvarchar(255)

SET @PackageID = ?

SET @PackageName = ?

SET @TaskID = ?

SET @TaskName = ?

 

IF @PackageID = @TaskID /* 패키지의 실행에 대한 입력인 경우*/

 BEGIN

  INSERT PackageHistory(PackageID, PackageName, ExecStartTime, Status)

  VALUES (@PackageID, @PackageName, GETDATE(), 'R')

 END

ELSE

 BEGIN /* 패키지 내의 작업인 경우 */

  INSERT TaskHistory(PackageID, PackageName, TaskID, TaskName, ExecStartTime, Status)

  VALUES (@PackageID, @PackageName, @TaskID, @TaskName, GETDATE(), 'R')

 END

 

 

 

 

매개 변수 매핑 탭에서 다음과 같이 입력 변수를 지정합니다.

 

변수 이름

방향

데이터 형식

매개 변수 이름

System::PackageID

Input

GUID

0

System::PackageName

Input

NVARCHAR

1

System::SourceID

Input

GUID

2

System::SourceName

Input

NVARCHAR

3

 

 

, 이제 OnPreExecute 이벤트에 대한 작업 프로세스 정의가 완료되었습니다. 패키지가 실행 될 때, 패키지 내의 여러 작업 개체들이 실행될 때마다 위에서 정의된 쿼리가 실행이 되어 조건에 맞는 테이블에 데이터가 입력됩니다.

 

OnPreExecute 이벤트와 동일한 방식으로 OnPostExecute 이벤트에 대해서도 이벤트 처리기를 생성합니다. 이 이벤트 처리기에도 SQL 실행 작업을 하나 추가한 후, 이름을 로그 기록으로 변경하고, 작업 편집기에서 Connection을 지정한 후, SqlStatement에 다음과 같은 쿼리를 입력합니다.

DECLARE @PackageID nvarchar(50), @PackageName nvarchar(255), @TaskID nvarchar(50), @TaskName nvarchar(255)

SET @PackageID = ?

SET @PackageName = ?

SET @TaskID = ?

SET @TaskName = ?

 

 

IF @PackageID = @TaskID /* 패키지의 실행에 대한 완료인 경우 */

 BEGIN

  UPDATE A

  SET ExecEndTime = GETDATE(), Status = 'Y'

  FROM PackageHistory A

  WHERE PackageID = @PackageID AND PackageName = @PackageName AND

   SEQ = (SELECT MAX(SEQ) FROM PackageHistory (NOLOCK)

    WHERE PackageID = @PackageID AND PackageName = @PackageName

     AND Status <> 'Y')

 END

ELSE

 BEGIN /* 패키지 내의 작업의 완료인 경우 */

  UPDATE A

  SET ExecEndTime = GETDATE(), Status = 'Y'

  FROM TaskHistory A

  WHERE PackageID = @PackageID AND PackageName = @PackageName AND

   TaskID = @TaskID AND TaskName = @TaskName AND

   SEQ = (SELECT MAX(SEQ) FROM TaskHistory (NOLOCK)

    WHERE PackageID = @PackageID AND PackageName = @PackageName

     AND TaskID = @TaskID AND TaskName = @TaskName

     AND Status <> 'Y')

 END

 

 

OnPreExecute 이벤트에서와 마찬가지로 매개 변수 매핑 탭에서 동일한 형태로 매개 변수를 지정합니다.

 

 

 

, 이제 로깅 기록 설정이 완료되었습니다.

패키지를 실행시킨 후, 테이블에 저장된 데이터를 확인합니다.

 

 

 

 

 

PackageHistory 테이블에는 패키지 단위로 시작 시간 및 종료 시간, 상태 정보가 기록되며, TaskHistory 테이블에는 패키지(WebLogLoading)내의 개별 작업 단위로 시작 시간 및 종료 시간, 상태 정보가 기록됩니다.

필요에 따라 데이터 처리 건수나 처리 파일 명 등 필요한 열 정보들을 추가할 수도 있습니다.

 

 

반응형
반응형


7강 대상 테이블 동적 설정

 

한대성 (admin@sqlleader.com)

에이디컨설팅 / 책임 컨설턴트

SQLLeader.com / 운영자

 

 

지금까지는 입력 데이터에 대해 WebLogData이라는 하나의 테이블에 로딩되도록 패키지를 구현하였습니다. 이번 강좌에서는 일자별로 대상 테이블을 달리하는 형태의 패키지를 구성해보도록 하겠습니다.

예를 들어 입력 데이터가 ex070217.log인 경우, 대상 테이블 역시 WebLogData_20070217, ex070218.log인 경우, WebLogData_20070217로 적재하도록 구현하는 것입니다.

 

패키지를 구성하기에 앞서 잠시 다음과 같은 일반적인 사항에 대해 잠시 언급하겠습니다. 매일 수행되는 작업을 구성하는 경우, DTS 패키지 또는 다른 ETL, 저장 프로시저 등에서 다음과 같은 형태의 쿼리를 자주 사용합니다.

 

SELECT Col1, Col2, Col3,, Coln

FROM Table

WHERE DateCol >= CONVERT(CHAR(10), GETDATE(), 121)

    AND DateCol <CONVERT(CHAR(10), GETDATE() + 1, 121)

GO

 

날짜 조회 방법은 이 외에도 다른 방법이 있겠지만, 그것보다 GETDATE() 또는 스크립트에서 DATE()를 쓰는 형태입니다.

 

위와 같은 형태로 작성된 패키지 또는 프로시저가 문제 없이 매일 매일 잘 수행되는 경우에는 아무런 문제가 없습니다. 하지만, 1 365일 단 한번도 문제없이 잘 수행되는 경우는 극히 드물 것입니다.

만약 이와 같은 형태로 패키지를 만들었는데, 당일 작업이 실패가 난 경우에는 그냥 수행하면 될 것입니다. 하지만, 며칠이 지난 후에 발견한 경우에는 상황이 많이 복잡해 질 수 있겠지요.

패키지 내에서 GETDATE() 부분을 찾아서 특정 날짜로 변경한 후에 수정해 줘야 할 것입니다. 패키지 내에 작업이 몇 개밖에 없다면 간단히 처리할 수 있겠지만 패키지 내에 수정해야 할 부분이 많거나 패키지의 수가 많다면 고된 작업일 것입니다.

 

간단한 사항 가지고 너무 길게 적은 것 같은데, 필자가 말하고자 하는 요지는

 

『날짜를 이용하는 데이터 처리 작업에서는 GETDATE() 대신에 변수를 이용하여 패키지를 구성하자는 것』

 

입니다.

위의 쿼리의 경우, GETDATE()를 직접 쓰는 대신 다음과 같이 설정합니다.

DECLARE @INPUTDATE DATETIME

SET @INPUTDATE = GETDATE()

 

SELECT Col1, Col2, Col3,, Coln

FROM Table

WHERE DateCol >= CONVERT(CHAR(10), @INPUDATE, 121)

    AND DateCol <CONVERT(CHAR(10), @INPUDATE + 1, 121)

GO

 

패키지에서도 이와 마찬가지로, 작업을 수행하는 날짜 변수를 정의하고 각 작업 개체들에서는 이 날짜 변수를 이용하도록 구성하는 것입니다.

 

 

 

5강에서 만든 패키지를 이용하여 계속 진행하겠습니다.

변수 창에서 날짜 값을 저장하는 변수를 하나 추가합니다.

 

 

ExecDate라는 String형 변수를 추가하고 값에는 20070217을 입력합니다.

 

변수 중, FileName이라는 변수를 선택한 후, 속성 창에서 Expression에 다음과 같이 설정합니다.

             "ex" + SUBSTRING(@[사용자::ExecDate], 3, 6) + ".log"

 

 

그런 다음, EvaluateAsExpression 옵션을 False에서 True로 설정합니다.

 

, 이제 ExecDate에 날짜 값이 설정되면 FileName이라는 변수에 해당 날짜의 파일명이 되도록 설정하였습니다.

 

이제, 제어 흐름의 대상 테이블 생성 작업을 더블 클릭한 후, 탭의 오른쪽 부분에 있는 Expressions를 선택한 후, ... 버튼을 클릭합니다.

속성 식 편집기에서 SqlStatementSource를 선택한 후, 다음과 같은 식을 입력합니다.

 

"IF EXISTS (SELECT * FROM sysobjects WHERE Type = 'U' AND Name = N'WebLogData_" + @[사용자::ExecDate] + "')

        DROP TABLE WebLogData_" + @[사용자::ExecDate] + "

GO

 

CREATE TABLE WebLogData_" + @[사용자::ExecDate] + "

(

        Seq int identity(1,1) NOT NULL,

        Date char(10) NOT NULL,

        Time char(8) NOT NULL,

        IP varchar(15) NOT NULL,

        URI_Stem varchar(255) NULL,

        Uri_Query varchar(255) NULL,

        Status smallint NULL,

        User_Agent varchar(200) NULL,

        CONSTRAINT PK__WebLogData_" + @[사용자::ExecDate] + " PRIMARY KEY(Seq)

)

GO"

 

 

이제 WebLog 데이터 로딩 작업을 더블 클릭하여 데이터 흐름 영역을 연 후, 여기에서도 변수를 하나 추가합니다.

변수의 이름은 TargetTable이며, String형으로 설정하고 값 부분에 WebLogData를 입력합니다.

 

 

TargetTable 변수를 선택한 상태에서 속성 창의 Expression에 다음과 같은 식을 입력합니다.

"WebLogData_" + @[사용자::ExecDate]

 

 

속성 중에서 EvaluateAsExpression 옵션을 True로 변경하지 않았습니다. 이 옵션은 아래의 OLE DB 대상에서 변수를 설정한 후에 변경할 것입니다.

 

이 변수는 데이터 흐름 작업의 WebLogTable 대상에서 사용할 것입니다.

 

OLE DB 대상에서 대상을 지정하는 방법은 다음과 같이 5 종류입니다.

 

 

5강까지는 직접 테이블을 지정하였기 때문에 테이블 또는 뷰 빠른 로드를 선택하였지만, 이제 매일 대상이 바뀌도록 설정해야 하기 때문에 달리 설정해야 합니다.

 

만약 WebLogTable 대상에서도 제어 흐름의 작업과 같이 Expressions가 있다면 직접 식을 입력해서 대상 테이블을 설정해도 되지만, 데이터 흐름 내의 작업 중 일부 개체 외에는 식을 이용하여 지정할 수는 없습니다.

 

데이터 액세스 모드를 테이블 이름 또는 뷰 이름 변수 빠른 로드로 설정한 후, 변수 이름에 『사용자::TargetTable』을 설정합니다.

 

 

※ 참고

만약 WebLogData 테이블이 없는 경우에는 이 단계에서 에러가 날 것입니다. 이 경우에는 1강의 테이블 생성 쿼리를 이용하여 WebLogData 테이블을 미리 만든 후에 다시 변수를 설정하시기 바랍니다.

 

여기까지 설정하고 확인을 눌러 OLE DB 대상 편집기를 닫은 후, 변수 창에서 TargetTable을 선택하고 속성 부분의 EvaluateAsExpression 옵션을 False에서 True로 변경합니다.

 

 

 

, 이제 패키지의 ExecDate 변수의 값을 변경하면서 작업을 실행하면 다음과 같이 일별 대상 테이블이 생성됩니다.

 

 

 

반응형
반응형


6강 여러 파일에 대한 처리

 

한대성 (admin@sqlleader.com)

에이디컨설팅 / 책임 컨설턴트

SQLLeader.com / 운영자

 

 

지금까지는 하나의 웹 로그 파일을 이용하여 데이터를 처리하였습니다. 이번 6강 및 7강에서는 여러 파일에 대한 처리 방법을 설명 드리겠습니다.

 

지금까지 사용했던 ex070217.log 로그 파일 외에 추가로 4개의 로그 파일을 더 다운 받으시기 바랍니다.

 

 

이 로그 파일들은 모두 같은 형식이라고 가정하겠습니다.

 

SSIS의 여러 좋은 기능들 중에서 크게 내세우는 기능 중의 하나가 반복(Iteration) 기능 또는 루핑(Looping) 기능입니다.

 

 

A. Foreach 루프 컨테이너를 이용한 처리 방법

 

 

Foreach 루프 컨테이너는 지정된 원본 경로( : D:\SSIS\Data\)에 대해 지정된 조건( : ex*.log)에 대한 파일 명을 읽어옵니다.

② 읽어온 파일 명 정보( : D:\SSIS\Data\ex070217.log) SSIS의 사용자 변수에 저장하도록 설정합니다.

③ 변수에 저장된 파일 명 정보를 연결 관리자의 WebLogFile 연결에서 이용합니다.

WebLog 데이터 로딩 작업 내의 WebLogFile 원본에서는 연결 관리자WebLogFile 연결을 이용하게 되어 지정된 파일에 대한 변환 및 로딩 작업을 수행합니다.

Foreach 루프 컨테이너에서는 지정된 원본 경로에 조건에 맞는 모든 파일들에 대해 이 작업을 반복적으로 수행합니다.

 

이와 같은 단계로 복수 파일을 처리하게 됩니다.

 

 

5강에서 이용한 패키지 파일을 이용하여 계속 진행하도록 하겠습니다.

 

다음과 같이 Foreach 루프 컨테이너를 추가한 후, 대상 테이블 생성 작업을 컨테이너 밖으로 제외시키고 나머지 두 작업을 컨테이너 내에 추가합니다.

 

기존 형태

 

변경된 형태

 

변경된 형태의 원본 파일 검사 작업과 WebLog 데이터 로딩 작업 사이의 선행 제약 조건에는 3강에서와 같이 조건식을 설정합니다.

 

 

Foreach 루프 컨테이너를 더블 클릭해서 편집기를 엽니다.

 

기본 EnumeratorForeach File 열거자가 설정되어 있습니다. 여기서, 윗부분에 있는 Expressions를 선택한 후, ... 버튼을 눌러 속성 식 편집기 창을 띄우고 Directory 속성에 SourceFolderName 변수를 선택합니다. 이것은 3강에서 정의한 SourceFolderName 변수와 FileName 변수를 이용하기 위한 설정입니다.

 

 

파일(I) 부분에는

ex*.log

로 입력하고, 파일 이름 검색 부분에서는 이름 및 확장명(E)을 선택합니다.

 

 

이제 변수 매핑 탭을 선택한 후, 읽어온 파일 명( : ex070217.log)을 저장할 변수를 지정합니다. 이 변수 역시 3강에서 추가한 FileName 변수를 이용합니다.

 

 

 

, 이제 연결 관리자에 있는 WebLogSourceFile에서 두 변수(SourceFolderName, FileName)를 이용하도록 설정하는 단계이지만, 이미 이것도 3강에서 설정하였습니다.

확인 차원에서 WebLogSourceFile 연결을 선택하고 속성 창에서 Expressions 부분을 확장하여 ConnectionString 속성에 정의된 식을 확인해 보시기 바랍니다.

 

 

 

WebLog 데이터 로딩 작업 내의 WebLogFile 연결에서는 WebLogSourceFile을 이용하도록 이미 1강에서부터 설정되어 있기 때문에 별도로 설정할 사항은 없습니다.

 

, 이제 패키지를 실행시켜서 모든 데이터가 다 들어갔는지를 확인해 봅니다.

 

 

 

 

 

 

B. 다중 플랫 파일 연결을 이용한 처리

 

두 번째 방법은 비교적 많이 알려지지 않은 방법입니다. 우선 5강에서 사용하였던 패키지를 계속해서 이용하도록 하겠습니다. 그리고, 참고로 말씀 드리자면 7강에서도 역시 5강의 패키지를 이용할 것입니다.

 

연결 관리자에서 마우스 오른쪽 클릭을 해서 나타나는 메뉴 중 새 연결(W)를 선택한 후, MULTIFLATFILE 연결을 추가합니다.

 

 

연결 관리자 편집기에서 연결 이름을 WebLogSourceFileMulti로 지정하고 1강에서와 WebLogSourceFile 연결을 설정한 것과 같이 열 정보를 설정합니다.

 

 

그런 다음, 다시 일반 탭으로 돌아가서 파일 이름

             D:\SSIS\Data\ex*.log

으로 지정합니다.

 

제어 흐름 영역에 있는 원본 파일 검사 작업은 삭제하고, WebLog 데이터 로딩 작업 중 WebLogFile 원본의 플랫 파일 연결 관리를 기존의 WebLogSourceFile에서 WebLogSourceFileMulti로 변경합니다.

 

 

패키지를 실행시켜서 처리되는 형태와 데이터를 확인해 보시기 바랍니다.

 

 

 

데이터 흐름에서 처리되는 형태를 보면 60,014건이 나타납니다.

 

, 파일 별로 작업을 여러 번 수행하는 것이 아니라, 파일을 읽어오는 단계에서 여러 파일들을 읽어와서 처리하는 형태입니다.

 

Foreach 루프 컨테이너를 이용하는 방식에 비해 변수나 별도의 컨테이너 등을 사용하지 않기 때문에 비교적 간단하게 처리할 수 있으며, 개별 파일을 처리하는 형태로 만든 패키지를 이용하여 한 번에 여러 파일을 처리해야 할 경우에 유용하게 사용할 수 있는 방식입니다.

 

 

 

반응형
반응형


5강 멀티캐스트를 이용하여 복수 대상으로 적재

 

한대성 (admin@sqlleader.com)

에이디컨설팅 / 책임 컨설턴트

SQLLeader.com / 운영자

 

 

다음과 같은 경우를 생각해 봅시다.

본사의 처리 프로세스에서 처리된 Source Table 데이터를 지점 1,2,3으로 보내야 하는 경우가 있습니다.  이 경우, Source Table에서 읽은 후, 지점 1로 보내고, 다시 Source Table에서 읽은 후, 지정 2, 지점 3으로 보내야 합니다.

 

 

만약 Source Table의 데이터가 계속해서 수정이 일어나는 경우라면, 별도의 임시 테이블이나 파일 형태로 전송할 데이터를 복사하고, 이 데이터를 지점 1,2,3으로 보내는 형태로 구현해야 합니다.

 

이번 강좌에서 설명드릴 내용은 위와 같이 여러 데이터 대상으로 데이터를 적재하는 방식에 대한 구현 방식이며, 작업 내용은 비교적 간단합니다.

4강까지 구현한 내용은 텍스트 파일에서 데이터를 읽은 후, 필터링 및 정렬을 거쳐 WebLogTable 에 로딩하는 것입니다. 여기에 다음과 조건을 추가하겠습니다.

『필터링 및 정렬된 데이터를 WebLogTable 뿐만 아니라 백업 용도로 D:\WebLogBackup.bak 형태의 CSV 파일로 보관』

하는 조건입니다.

 

 

4강까지 만든 예제를 계속 사용합니다.

 

WebLog 데이터 로딩 작업의 데이터 흐름 영역을 엽니다.

정렬 변환과 WebLogTable 사이의 연결선을 삭제한 후, 중간에 멀티캐스트 변환을 추가합니다. 멀티캐스트 변환은 4강에서 사용한 조건부 분할과 비슷한 형태이지만, 조건 없이 입력 데이터를 그대로 복사해서 여러 경로로 출력하는 역할을 수행합니다.

 

도구 상자에서 플랫 파일 대상을 추가한 후 이름을 WebLogBackupFile로 변경하고, 멀티캐스트 개체와 연결합니다.

 

WebLogBackupFile을 더블 클릭해서 대상 편집기를 연 후, 새로 만들기(N)을 클릭해서 플랫 파일 연결을 설정합니다. 이 연결의 이름을 WebLogBackupFile로 설정하고 다음과 같이 지정합니다.

 

 

탭을 클릭한 후 확인을 눌러 연결 관리자 편집기를 닫고 대상 편집기에서 매핑 탭을 클릭하여 열 매핑을 확인합니다.

 

 

 

패키지를 실행시키면 다음과 같이 동일한 처리 데이터가 WebLogTableWebLogBackupFile 두 군데로 동시에 출력됩니다. 물론 두 군데 이상도 지정 가능하며 OLE DB 대상을 이용하여 다른 서버의 DB Table로도 출력할 수 있습니다.

이렇게 여러 대상으로 출력을 시키더라도 원본의 데이터를 읽는 작업은 단 한번만 수행하기 때문에 불필요한 디스크 I/O 부하가 발생하지 않습니다.

반응형
반응형


4강 데이터 필터링 구현

 

한대성 (admin@sqlleader.com)

에이디컨설팅 / 책임 컨설턴트

SQLLeader.com / 운영자

 

 

이번 강좌에서는 데이터 로딩 작업 시 불필요한 정보를 필터링하는 작업이나 열 변환 작업 등을 구현해 보도록 하겠습니다.

 

ETL이라 하면 Extract (추출), Transformation (변환), Loading(적재) 작업을 말합니다. 이 중에서 현재까지 구현한 것은 Extract Loading 작업입니다. 텍스트 웹 로그 파일을 읽어와서 테이블에 넣기까지는 구현 하였으며 이제 변환을 구성해야 할 단계입니다.

 

다음과 같은 처리 방법을 생각해 봅시다.

 

             [유형 1] 임시 테이블을 이용한 처리 방법

                          

 

[유형 2] 데이터 로딩 전 직접 처리 방법

               

 

 

[유형 1] DTS 또는 쿼리를 이용하여 처리할 때 주로 사용하는 방식이며, [유형 2] SSIS 및 일반 ETL 솔루션에서 처리하는 방식입니다.

[유형 2]와 같은 경우, 임시 테이블 적재와 같은 스테이징(Staging) 단계가 없기 때문에 디스크 I/O를 감소시킬 수 있으며 DBMS에 의존하지 않고 바로 처리할 수 있다는 점도 큰 장점입니다. 뿐만 아니라, SQL 쿼리로 구현할 수 있는 기능에 국한되지 않고, 여러 다양한 형태의 변환 작업을 쉽게 구현할 수도 있습니다.

 

 

 

3강의 예제를 이용하여 계속해서 진행하도록 하겠습니다.

제어 흐름의 세 작업 중에서 WebLog 데이터 로딩 작업의 데이터 흐름 영역을 엽니다.

 

WebLogFile 원본과 WebLogTable 대상 사이에 조건부 분할파생 열 변환, 정렬 변환을 추가하고 다음과 같이 연결합니다.

 

           

 

조건부 분할은 입력 데이터(Stream) 중 설정된 조건에 따라 여러 경로로 분할시키는 변환이며, 파생 열 변환은 기존의 열 값 똔는 외부 변수를 이용하여 새로운 열을 추가하거나 기존 열을 대체하는 변환입니다. 정렬 변환은 이름 그대로 설정된 열에 따라 데이터를 정렬 시키는 역할을 합니다.

 

조건부 분할은 데이터를 필터링 하는 경우에도 자주 이용됩니다. 조건부 분할 개체를 더블 클릭해서 변환 편집기를 연 다음 다음과 같이 조건식을 설정합니다.

 

 

Uri_Stem 열의 끝 세 자리 또는 두 자리가 gif, jpg, js 등과 같은 확장자인 경우, gif, jpg 등과 같은 이름의 출력 경로로 출력하도록 하고, 그렇지 않은 경우에는 기본 출력 이름인 『필터링된 결과』로 출력하도록 설정한 것입니다.

 

이와 같이 설정한 후, 조건부 분할파생 열 변환 사이의 연결선을 지우고 다시 연결하면 다음과 같은 경로 선택 창이 나타납니다.

 

 

출력(O)에서 필터링된 결과 출력을 선택하고 확인을 누릅니다.

 

 

이제 파생 열 변환을 더블 클릭해서 변환 편집기를 엽니다.

 

식 부분에 다음과 같은 식을 입력하고 DateTime 이라는 이름의 새 열을 설정합니다.

 

 

Date 문자열과 Time 문자열을 결합하여 DateTime이라는 날짜 형식의 새로운 열을 추가한 것입니다.

 

이제, 정렬 변환을 더블 클릭해서 변환 편집기를 연 후 다음과 같이 DateTime 열에 정렬을 설정합니다.

 

 

입력 데이터를 DateTime 순으로 정렬하였습니다.

 

 

, 이제 정렬 설정까지 마쳤는데 아직도 WebLogTable 부분에는 빨간 경고가 나타나 있습니다.

 

 

이것은 이전에 WebLogFile에서 연결한 설정 사항이 아직 남아 있기 때문입니다.

WebLogTable 작업을 더블 클릭하면 다음과 같은 경고 창이 나타납니다.

 

 

, 이전에 WebLogTable에서는 Date라는 18 ID를 가진 입력이 있었는데 없어졌다. 그런데 정렬에서 들어오는 Date라는 이름의 323번 열이 적당할 것 같다.』라는 의미입니다. 이 외의 열 들도 마찬가지입니다. 18, 22, 26, …, 323, 328 등과 같은 숫자는 각 열의 고유한 ID 입니다.

 

이 열 들을 모두 선택한 후, <열 이름을 사용한 매핑>을 선택하고 적용 버튼을 클릭하고 확인을 누릅니다.

 

 

 

이제 빨간 경고 표시가 사라졌습니다. 패키지를 실행해서 입력되는 데이터를 확인해 봅니다.

 

 

10,051개의 입력 데이터 중, 필터링 되어 최종 769개의 데이터만 입력이 되었습니다.

참고로, 위의 경우 조건부 분할정렬의 순서를 변경하여 처리를 해도 됩니다. 하지만 10,051개를 정렬한 후에 필터링 하는 형태가 되기 때문에 성능은 훨씬 저하됩니다.

 

 

이것으로 4강 변환 구현 강좌를 마치겠습니다. 여기에 소개된 기본적인 세 가지 유형의 변환 외에도 다양한 형태의 변환들이 있습니다. 이를 적절히 이용하여 원하는 형태의 데이터로 변환할 수 있습니다.

 

 

반응형
반응형


3강 파일 존재 확인 작업 추가

 

한대성 (admin@sqlleader.com)

에이디컨설팅 / 책임 컨설턴트

SQLLeader.com / 운영자

 

 

이번 강좌에서 다룰 내용은 파일이 존재하는지를 확인하는 단계를 구현하는 것입니다. 2강에서 대상 테이블이 없는 경우에 테이블을 생성하는 작업을 구현한 것과 같이, 이번 단계는 원본 파일이 있는지를 확인하고 파일이 있는 경우에만 로딩 작업을 진행하도록 하는 기능을 추가하는 것입니다.

 

SSIS에서 기본적으로 제공되는 여러 작업 개체들 중에서 파일과 관련된 작업을 할 수 있는 파일 시스템 작업이라는 것이 있습니다. 이 작업 개체를 이용해서 파일 복사 또는 디렉터리 삭제 등과 같은 파일과 관련된 여러 가지 형태의 작업들을 수행하게 됩니다. 하지만, 파일이 존재하는지를 확인하는 기능은 없습니다.

 

SQL 2000 DTS 또는 다른 ETL 툴에 비해 기본적으로 제공되는 기능들이 상당히 많기는 하지만, 이와 같이 모든 형태의 작업이 다 갖추어져 있는 것은 아닙니다. 이런 경우에 유용하게 이용할 수 있는 작업 개체가 스크립트 작업입니다.

 

기본적으로 제공되는 작업 개체들과는 달리 어느 정도의 프로그래밍 기술이 필요하기는 하지만, 그렇게 고차원적인 프로그래밍 기술력을 요구하지는 않습니다.

 

2강의 예제 패키지에 스크립트 작업을 하나 추가하고 이름을 원본 파일 검사라고 변경한 후, 대상 테이블 생성 작업을 연결합니다.

 

 

원본 파일 검사 작업을 더블 클릭해서 스크립트 작업 편집기를 연 후, 스크립트 탭의 아래 부분에 있는 스크립트 디자인(S)를 클릭하여 VSA(Visual Studio for Application)를 엽니다.

이 스크립트 창에 다음과 같은 스크립트를 입력합니다.

(먼저 말씀 드리자면 이 스크립트는 뒷부분에서 변경할 것입니다.)

 

‘ Microsoft SQL Server Integration Services Script Task

' Write scripts using Microsoft Visual Basic

' The ScriptMain class is the entry point of the Script Task.

 

Imports System

Imports System.Data

Imports System.Math

Imports Microsoft.SqlServer.Dts.Runtime

Imports System.IO

 

Public Class ScriptMain

 

                  ' The execution engine calls this method when the task executes.

                  ' To access the object model, use the Dts object. Connections, variables, events,

                  ' and logging features are available as static members of the Dts class.

                  ' Before returning from this method, set the value of Dts.TaskResult to indicate success or failure.

                  '

                  ' To open Code and Text Editor Help, press F1.

                  ' To open Object Browser, press Ctrl+Alt+J.

 

                  Public Sub Main()

                                   '

                                   ' Add your code here

                                  '

        If File.Exists("D:\SSIS\Data\ex070217.log") Then

            Dts.TaskResult = Dts.Results.Success

        Else

            Dts.TaskResult = Dts.Results.Failure

        End If

 

 

    End Sub

 

End Class

 

이 스크립트는 D:\SSIS\Data\ex070217.log 라는 파일이 있는 경우에는 원본 파일 검사 작업이 성공적으로 처리되고, 파일이 없는 경우에는 실패로 처리되어 다음 단계로 진행하지 않습니다.

 

 

이렇게 간단히 구현해도 되지만, 이 스크립트 및 처리 방식의 문제점들을 한 번 짚어 봅시다.

 

[문제점 1] 파일이 없는 경우에 해당 작업을 실패로 처리하는 것은 너무 가혹(^^)합니다. 패키지에서의 작업 실패는 함부로 발생시켜서는 안될 사항입니다. 왜냐면, 진짜 패키지의 어딘가에서 예측하지 못하는 문제가 발생되어 에러가 발생하는 경우와 파일이 없는 경우와 같이 예측 가능한 상황에서 에러로 처리하는 경우를 구분하지 않는다면 관리 차원에서 어려울 수 있습니다.

이러한 경우, 즉 파일이 없는 경우에는 작업을 실패로 처리하는 대신 단순히 다음 단계로 진행 시키지 않는다든지 또는 담당자에게 메일을 보내도록 프로세스를 구성하는 것이 더 바람직합니다.

 

[문제점 2] 스크립트 작업 내에 D:\SSIS\Data\ex070217.log를 하드 코딩한 부분입니다. 만약에 작업할 파일명이 변경되거나 파일이 저장되는 디렉터리가 D:\SSIS\Data\가 아닌 다른 곳으로 변경될 경우, 스크립트를 열어서 해당 부분을 수정하고 또 WebLog 데이터 로딩 작업에서의 원본에 대한 위치 정보(WebLogFile)도 변경해야 합니다. WebLogFile 원본은 연결 관리자의 WebLogSourceFile이라는 연결을 이용하기 때문에 이 연결 정보의 속성을 변경해야 하겠지요. 만약 이와 같이 파일의 위치 정보를 설정하는 작업들이 더 늘어난다면 더욱 복잡해 질 수 있습니다. 파일을 삭제하거나 압축, 복사 하는 등의 추가 작업까지 구성될 경우, 파일명이 변경되거나 폴더 명이 변경되면 모든 작업 개체의 속성 값들을 일일이 변경해줘야 할 것입니다. (이 얼마나 비효율적인 패키지입니다.^^)

이러한 경우, 유용하게 사용할 수 있는 것이 변수입니다. 정확히 말해서 SSIS 변수입니다.

SourceFolderName이라는 변수와 FileName 이라는 변수를 정의하고 각각의 변수에는 원본 경로와 파일 명을 저장합니다. 각 작업들, 예를 들어 원본 파일 검사 작업이나 연결 관리자의 WebLogSourceFile에서 이 변수 값을 이용하도록 설정하는 것입니다. 만약 원본 파일명을 변경해야 할 경우에는 단순히 FileName 변수의 값을 변경하면 될 것이며, 원본 파일의 위치가 변경될 경우에는 SourceFolderName 변수의 값만 변경하면 될 것입니다.

 

이 두 가지 문제를 모두 다 해결하는 형태로 작업을 구성해 봅시다.

우선 제어 흐름 영역의 빈 곳을 선택한 후, 마우스 오른쪽 버튼을 클릭해서 나타나는 메뉴 중 변수(S)를 클릭하여 변수 창을 띄웁니다.

이 창에서 다음과 같이 변수를 추가합니다.

 

 

그런 다음, 원본 파일 검사 작업을 더블 클릭해서 나타나는 스크립트 작업 편집기의 스크립트 탭에서

ReadOnlyVariables 부분에 SourceFolderName,FileName

ReadWriteVariables 부분에 FileExistYN

을 입력하고 스크립트 디자인(S)를 클릭해서 다시 VSA를 띄웁니다.

이러한 설정 작업은 스크립트 작업에서 이와 같은 변수들을 쓰겠다라는 것을 정의하는 것입니다.

' Microsoft SQL Server Integration Services Script Task

' Write scripts using Microsoft Visual Basic

' The ScriptMain class is the entry point of the Script Task.

 

Imports System

Imports System.Data

Imports System.Math

Imports Microsoft.SqlServer.Dts.Runtime

Imports System.IO

 

Public Class ScriptMain

 

                  ' The execution engine calls this method when the task executes.

                  ' To access the object model, use the Dts object. Connections, variables, events,

                  ' and logging features are available as static members of the Dts class.

                  ' Before returning from this method, set the value of Dts.TaskResult to indicate success or failure.

                  '

                  ' To open Code and Text Editor Help, press F1.

                  ' To open Object Browser, press Ctrl+Alt+J.

 

                  Public Sub Main()

                                   '

                                   ' Add your code here

        '

        Dim SourceFolderName As String = Dts.Variables("SourceFolderName").Value.ToString

        Dim FileName As String = Dts.Variables("FileName").Value.ToString

        Dim FileExistYN As Boolean

 

 

        If File.Exists(SourceFolderName & FileName) Then

            FileExistYN = True

        Else

            FileExistYN = False

        End If

 

        Dts.Variables("FileExistYN").Value = FileExistYN

 

        Dts.TaskResult = Dts.Results.Success

 

    End Sub

 

End Class

 

파일의 존재 여부를 검사하기 위해 하드 코딩된 경로를 이용해서 찾는 것 대신 SourceFolderName FileName 변수를 이용해서 확인합니다. 파일이 존재하는 경우에는 FileExistYN 이라는 변수 값에 True가 저장되며 파일이 없는 경우에는 False가 저장됩니다.

 

이제 원본 파일 검사 작업과 대상 테이블 생성 작업을 연결시켜주는 녹색 선을 더블 클릭하여 선행 제약 조건 편집기를 엽니다.

 

평가 작업(E)식 및 제약 조건으로 변경하고 (X) 부분에

@FileExistYN == True

를 입력합니다

 

 

연결 선에 식이 포함되었다라는 의미로 위와 같이 fx라는 마크가 표시됩니다.

원본 파일 검사 작업이 수행되어 파일 존재 여부 결과를 FileExistYN이라는 변수에 저장하고, 이 값이 True인 경우와 원본 파일 검사 작업이 성공적으로 처리된 경우에만 다음으로 진행하도록 설정한 것입니다. 이 때 식에서 등호가 두 개(==)라는 것에 주의합니다.!

 

만약 파일이 없을 경우에는 다음과 같이 원본 파일 검사만 하고 패키지를 종료하게 됩니다.

 

 

, 여기서 하나 빼먹은 것이 있네요. 원본 파일 검사에서는 두 개의 변수를 이용해서 파일의 위치 정보를 이용하도록 하였지만, WebLog 데이터 로딩 작업 부분에서는 이러한 설정을 하지 않았습니다. 앞서 말한 바와 같이 WebLog 데이터 로딩 작업에서는 이러한 설정을 할 필요는 없습니다. 대신 이 작업이 이용한 WebLogSourceFile 연결 정보를 설정해야 합니다.

 

연결 관리자에서 WebLogSourceFile을 선택한 후, 속성 창에서 Expression 부분에 있는 ... 버튼을 클릭합니다.

 

속성 식 편집기에서 ConnectionString이라는 속성을 선택하고 오른쪽의 ... 버튼을 클릭하여 식 작성기를 띄웁니다.

식 부분에 다음과 같은 식을 입력하고(변수를 끌어서 작성할 수도 있습니다.)

 

@[사용자::SourceFolderName] + @[사용자::FileName]

 

식 계산(V) 버튼을 클릭하여 작성되는 식을 확인합니다.

 

 

속성의 Expression을 확장해 보면 다음과 같이 ConnectionString에 대한 속성식이 설정된 것을 확인할 수 있습니다. 이 외에도 필요에 따라 다양한 속성값들에 대해 속성식을 정의할 수 있습니다.

 

 

 

이제 어느 정도 조금씩 패키지 형태를 갖추어 가는 듯 합니다. 귀찮더라도 한 번 직접 패키지를 구성해 보시기 바랍니다.^^

 

 

 

반응형
반응형

2강 일별 테이블 생성 작업 추가하기

 

한대성 (admin@sqlleader.com)

에이디컨설팅 / 책임 컨설턴트

SQLLeader.com / 운영자

 

 

1강이 생각보다 길었던 관계로 2강은 매우 짧게 진행하겠습니다. (길어야 좋을 것 없죠.ㅎㅎ)

파일에서 읽어온 데이터를 테이블에 넣는 작업을 할 때, 대상 테이블이 이미 있는 경우에는 문제가 없지만 테이블이 없는 경우에는 작업이 실패가 납니다. 본 강의에서는 이 대상 테이블이 있는지를 확인하고 없는 경우에는 만들어주는 SQL 실행 작업을 수행하는 작업 개체를 추가하는 것입니다.

 

1강의 패키지에서 계속 확장합니다. 테이블이 존재하고 생성하는 데 이용할 작업 개체는 뭐니뭐니해도 SQL 실행 작업이 최고입니다. 왜냐면? SQL 테이블을 관리하는 SQL 문을 실행하기 때문이지요.

 

제어 흐름에 있는 WebLog 데이터 로딩 작업 앞에다가 SQL 실행 작업을 추가하고 이 이름을 『대상 테이블 생성』이라고 변경합니다.

 

 

작업 옆에 빨간색으로 경고 마크가 신경 쓰이지만 일단은 무시하고,(뒤에서 설명 드립니다.) 해당 작업을 더블 클릭한 후 나타나는 SQL 실행 작업 편집기에서 다음과 같이 연결과 SQL 실행 쿼리를 설정합니다.

 

 

SQLStatement 1강에 있었던 테이블 생성문을 그대로 입력하면 됩니다.

IF EXISTS (SELECT * FROM sysobjects WHERE Type = 'U' AND Name = N'WebLogData')

       DROP TABLE WebLogData

GO

 

CREATE TABLE WebLogData

(

       Seq int identity(1,1) NOT NULL,

       Date char(10) NOT NULL,

       Time char(8) NOT NULL,

       IP varchar(15) NOT NULL,

       URI_Stem varchar(255) NULL,

       Uri_Query varchar(255) NULL,

       Status smallint NULL,

       User_Agent varchar(200) NULL,

       CONSTRAINT PK__WebLogData PRIMARY KEY(Seq)

)

GO

 

이 쿼리문을 외부에 파일로 저장한 후, 이를 지정할 수도 있습니다. (이런 형태로도 자주 이용됩니다.)

 

참고로, 편집기의 속성 중 BypassPrepare 옵션을 살펴봅시다.

 

 

SP2 이전에는 이 설정의 기본값이 False이었지만 SP2 이후에는 True로 변경된 것을 보실 수 있습니다.

 

 

작업 설정은 이걸로 끝입니다. 너무 썰렁한 것 같아 한 가지만 더 설명하겠습니다.

 

쿼리 분석기에서 대상 테이블을 삭제만 하고선 패키지를 다시 열어봅시다.

 

 

위와 같이 경고 마크가 나타납니다. 유효성 체크 오류라는 것입니다.

 

SSIS 패키지의 좋은 기능 중 하나인 실행 전 유효성 검사라는 기능으로 인해 나타나는 것입니다. 쉽게 설명하자면

 

WebLog 데이터 로딩 작업에서 WebLogData라는 테이블에 데이터를 넣도록 설정되어 있는데, 체크해 보니깐 해당 테이블이 없소이다. 뭔가 문제 있는 것 아닌가요?

 

라는 의미의 경고입니다. 실수로 테이블을 만들지 않은 경우라면 상당히 고마운 메시지이지요. 실컷 작업을 수행하다가 에러를 발생시키는 것 보다는 미리 점검해 주기 때문입니다.

SSIS는 이러한 유효성 검사를 기본적으로는 세 번 합니다. 패키지 파일을 열 때, 패키지가 시작될 때, 그리고 해당 컨테이너(작업 포함)가 실행되는 시점입니다.

 

만약 위와 같은 경고가 나타난 상태에서 패키지를 실행하려고 하면 두 번째 유형의 유효성 검사에서 실패가 되어 실행이 안됩니다.

 

 

하지만 본 예제의 경우와 같이 패키지가 실행되면 테이블이 생성이 되어 정상적으로 작업이 수행될 것이 보장되는 경우에는 문제일 수 있습니다. 이러한 경우에 사용하는 옵션이 DelayValidation 이라는 옵션입니다.

WebLog 데이터 로딩 작업을 선택한 후, 속성 창에서 DelayValidation 옵션을 False에서 True로 변경을 합니다. 이 옵션을 설정하게 되면 해당 작업에 대한 세 단계의 유효성 검사 중, 첫 번째와 두 번째 단계를 하지 않게 됩니다. , 패키지를 열 때와 패키지를 시작할 때에는 유효성 검사를 하지 않고 해당 작업이 실행되는 시점에서만 유효성 검사를 하기 때문에 본 예제와 같은 경우에 문제없이 수행할 수 있게 됩니다.

 

 

패키지를 실행시키면 경고 표시가 있더라도 정상적으로 수행됩니다.

 

 

반응형
반응형


1강 텍스트 데이터 파일을 테이블로 로딩하기

 

한대성 (admin@sqlleader.com)

에이디컨설팅 / 책임 컨설턴트

SQLLeader.com / 운영자

 

 

가장 간단한 형태의 작업이면서도, 앞으로 진행할 강좌에서 다룰 기능들을 구현할 수 있는 형태의 작업에 대해 한참을 고민하다가 SQLLeader.com 웹 로그 데이터를 이용하자라고 결론을 내렸습니다. 매일 발생되면서, 다양한 유형의 데이터도 있으면서, 가끔 오류 데이터도 포함되어 있는 형태이기 때문에 적절하다고 생각합니다.^^

 

본 강의에서 구현할 내용은 D:\SSIS\Data\ 라는 폴더에 있는 ex070217.log라는 웹 로그 데이터 파일을 DB의 테이블에 적재하는 패키지를 만드는 것입니다.

 

ex070217.log는 아래와 같이 단순한 IIS 웹 로그 데이터 파일입니다.

 

 

이 데이터 파일을 적재할 대상 테이블은 다음과 같은 형태입니다.

USE TEMPDB

GO

 

IF EXISTS (SELECT * FROM sysobjects WHERE Type = 'U' AND Name = N'WebLogData')

       DROP TABLE WebLogData

GO

 

CREATE TABLE WebLogData

(

       Seq int identity(1,1) NOT NULL,

       Date char(10) NOT NULL,

       Time char(8) NOT NULL,

       IP varchar(15) NOT NULL,

       URI_Stem varchar(255) NULL,

       Uri_Query varchar(255) NULL,

       Status smallint NULL,

       User_Agent varchar(200) NULL,

       CONSTRAINT PK__WebLogData PRIMARY KEY(Seq)

)

GO

 

반드시 TEMPDB를 이용할 필요는 없습니다. 환경에 맞게 다른 DB를 지정하셔서 테이블을 만드시기 바랍니다.

 

 

 

, 이제 패키지를 만들어 봅시다.

(필요에 따라서는 중간중간 건너뛰셔도 됩니다.^^)

 

시작 -> 프로그램(P) -> Microsoft SQL Server 2005 -> SQL Server Business Intelligence Development Studio를 실행합니다.

 

일명 BIDS라고도 불리는 이 프로그램이 패키지를 만들기 위한 작업 툴입니다.

 

상단 메뉴에서 파일(F) -> 새로 만들기(N) -> 프로젝트(P)를 선택하고 프로젝트 설정 창에서 Integration Services 프로젝트를 선택합니다. 프로젝트 파일이 저장될 위치 등을 적절히 변경하도록 합니다.

 

SSIS 패키지를 만드는 데 솔루션은 뭐고 또 프로젝트는 뭐냐 라고 생각하실 수 있을 것 같아 간단히 설명 드리자면, SSIS 패키지는 Visual Studio 환경을 이용하여 개발합니다. 솔루션이나 프로젝트 등은 Visual Studio에서 어떠한 프로그램이나 패키지 등을 만들기 위한 개발 단위이며, SSIS 패키지를 만드는 행위 또한 이 규칙을 따라야 합니다. 하지만 최종적으로 패키지가 실행되거나 관리될 때에는 솔루션 또는 프로젝트 등은 사용되지 않고 오직 dtsx 확장자를 가진 패키지 파일만 이용됩니다.

 

조금 번거롭게 보일지도 모르겠지만 다음과 같이 좋게 생각해 볼 수도 있겠지요..

큰 회사에서 각 부서별로 여러 개의 데이터 처리 패키지를 만든다고 할 때, 아래와 같이 계층적으로 회사의 패키지들을 관리할 수도 있는 기능입니다.

 

에이디컨설팅이라는 회사 수준의 솔루션 내에 관리부, 이관부, 개발부라는 부서별 프로젝트가 존재하고, 프로젝트 내에 개별 패키지들이 존재하는 형태로 관리할 수 있겠지요. 여기서의 관리는 패키지 개발에 대한 관리를 말합니다. (소스 관리 형태이겠지요.)

 

 

일단 프로젝트가 만들어졌으면 다음과 같은 빈 패키지 화면이 덩그러니 나타날 것입니다.

 

우선 패키지 이름부터 변경합니다. 오른쪽의 솔루션 탐색기에서 Package.dtsx 패키지의 이름을 WebLogLoading.dtsx 라고 변경합시다.

 

왼쪽의 도구 상자에서 데이터 흐름 작업제어 흐름 영역에 추가하고, 이 작업의 이름을 WebLog 데이터 로딩』으로 변경합니다.

 

 

※ 패키지 이름이나 작업 이름을 지정하는 것은 번거롭고 생산성을 떨어뜨리는 행위일 수도 있으나 예제를 만들 때부터 이러한 습관을 유지하실 것을 권고 드립니다.

 

 

WebLog 데이터 로딩 작업을 더블 클릭해서 데이터 흐름 영역을 엽니다.

 

왼쪽의 도구 상자가 제어 흐름에서와는 다른 요소들로 변경되었을 것입니다. 이 작업 개체들은 데이터 흐름과 관련된 개체들로 구성된 것입니다.

 

도구 상자의 데이터 흐름 원본에서 플랫 파일 원본데이터 흐름에 추가하고 이 원본 개체의 이름을 WebLogFile이라고 변경합니다.

 

 

플랫 파일 원본을 이용하여 텍스트 파일의 데이터를 읽어오겠다라는 것을 정의한 것이라 할 수 있습니다. 추가한 WebLogFile 원본을 더블 클릭해서 편집기를 띄웁니다.

 

SSIS의 연결 관리자에 플랫 파일 연결이 정의되어 있는 경우에는 원본 편집기에서 나타나겠지만, 아직 추가하지 않은 상태라 아무런 목록이 나타나지 않습니다. 오른쪽의 새로 만들기(N)를 클릭하여 플랫 파일 연결을 하나 정의합니다.

 

다음과 같이 웹 로그 예제 파일이 있는 경로를 지정하고 건너뛸 머리글 행을 4로 설정합니다.

 

탭을 클릭한 후, 열 구분 기호 부분에 스페이스(‘ ‘)를 입력한 후, 열 다시 설정을 선택하면 자동으로 열이 설정됩니다.

 

 

 

고급 탭에서 각 열에 대한 속성을 다음과 같이 지정합니다.

열 이름

Name

DataType

OutputColumnWidth

0

Date

문자열(DT_STR)

10

1

Time

문자열(DT_STR)

8

2

IP

문자열(DT_STR)

15

3

UserName

문자열(DT_STR)

1

4

Method

문자열(DT_STR)

4

5

Uri_Stem

문자열(DT_STR)

255

6

Uri_Query

문자열(DT_STR)

255

7

Status

부호 있는 2바이트 정수 [DT_I2]

 

8

User_Agent

문자열(DT_STR)

200

9

Referer

문자열(DT_STR)

255

 

 

이제 확인을 눌러 플랫 파일 연결 관리자 편집기를 닫고, 플랫 파일 원본 편집기에서 탭을 선택하여 사용할 열 정보를 확인합니다.

 

, 이제 일단 파일로부터 읽어오는 기능은 구현이 되었습니다. 이제 대상 테이블을 설정하도록 하겠습니다.

도구 상자의 데이터 흐름 대상 부분에서 OLE DB 대상을 선택하여 데이터 흐름에 추가한 후, 이름을 WebLogTable로 변경하고, WebLogFile의 녹색 선을 끌어서 연결시킵니다.

 

 

WebLogTable을 더블 클릭하여 OLE DB 대상 편집기를 연 후, OLE DB 연결 관리자 설정 부분에서 새로 만들기(N)을 클릭하여 OLE DB 연결을 추가합니다. 이 역시, 이미 SSIS 패키지의 연결 관리자에서 OLE DB 연결을 지정해 놓았다면 드롭 다운 박스에 나타나겠지만, 미리 지정한 것이 없기에 대상에서 직접 추가하는 것입니다.

 

OLE DB 연결 관리자 구성 창에서 새로 만들기(E)를 이용하거나 사전에 정의해 놓은 DB 연결 설정이 있으면 해당 연결 정보를 선택합니다. 이 때의 서버 및 DB는 위의 예제 테이블이 있는 곳을 지정하는 것입니다.

 

연결을 설정하고 확인을 누른 후, OLE DB 대상 편집기에서 테이블을 지정합니다.

 

매핑 탭을 클릭하여 매핑이 제대로 이루어졌는지를 확인합니다. 기본적으로 동일한 이름에 대해 매핑을 자동으로 설정하게 됩니다.

 

 

, 이제 간단한 예제 패키지가 완성되었습니다. 끝내기 전에 하나만 더 설정하도록 합시다.

연결 관리자 부분에 보면 새롭게 추가된 OLE DB 연결이 있을 것입니다. 이 연결의 이름을 WebLogTargetTable로 변경하도록 합니다.

 

패키지를 실행시켜 보면 다음과 같이 실행되며, 테이블도 한 번 확인해 보시기 바랍니다.

 

 

 

 

 

 

 

반응형
반응형

텍스트 파일을 테이블로 로딩하는 단순한 기능부터 여러 기능들을 단계적으로 추가하는 방식으로 간단한 실습 강의를 준비하였습니다. 시간 날 때 그냥 구상하고, 데이터나 테이블, 기능들 또한 어줍잖게 생각한 것들이라 견고함이 조금 떨어질 지 모르겠지만, 패키지 하나를 처음부터 끝까지 살펴본다는 점으로 생각해 주시면 감사하겠습니다.

 

계획한 강좌는 다음과 같이 총 10강이며, 예제로 쓸 데이터는 샘플 웹 로그 데이터이고, 필요에 따라 중간 중간에 조건들을 추가하여 구성하도록 할 예정입니다.

 

[강좌 목록 및 요약]

1.         텍스트 데이터 파일을 테이블로 로딩하기

- 단순히 텍스트 파일을 테이블로 적재하는 패키지를 구현합니다. 앞으로 전개할 예제 강의 내용의 가장 기본이 되는 작업이라 할 수 있습니다.

 

2.         테이블 생성 작업 추가

- 1강에서는 대상 테이블이 존재한다라는 가정으로 시작하였는데, 대상 테이블이 있는지 확인하고 없는 경우에는 생성시켜주는 작업을 추가합니다.

 

3.         파일 존재 확인 작업 추가

- 2강과 마찬가지로 데이터 처리 작업의 선행 단계 작업입니다. 읽어올 파일이 존재하는지 여부를 확인하고, 읽어올 파일이 있는 경우에만 데이터 처리를 시작하는 기능을 구현합니다.

 

4.         데이터 로딩 시 필터링 구현 : 조건부 변환, 정렬, 파생 열 변환

- 텍스트 파일에서 데이터를 읽어온 후, 테이블에 적재하기 전에 몇 가지 변환 작업을 구현합니다. 예를 들어 읽어온 텍스트의 특정 열의 값을 판단하여 입력 여부를 결정하거나, 열 데이터를 정해진 규칙에 맞게 변경하는 작업 등을 구현합니다.

 

5.         멀티캐스트를 이용하여 복수 대상으로 적재

- 텍스트 파일에서 읽어온 데이터를 여러 대상으로 동일하게 또는 조건에 따라 다르게 여러 대상으로 적재하는 기능을 구현합니다.

 

6.         여러 파일에 대한 처리

- 읽어올 파일이 하나가 아니라 여러 개인 경우에 대한 처리 방법을 구현합니다. 이 방법은 잘 알려진 Foreach 루프 컨테이너를 이용하는 방법 외에 조금 덜 알려진 방법인 다중 플랫 파일 연결을 이용하는 방법으로 설명합니다.

A.       Foreach 루프 컨테이너를 이용한 처리

B.       다중 플랫 파일 연결을 이용한 처리

 

7.         대상 테이블 동적 설정 : 날짜 별 대상 테이블 생성 및 적재

- 이제 조금 현실적인 패키지로 발전합니다. 단순히 일회성 작업이 아니라 매일 매일 수행되는 작업인 경우에 대한 처리 작업을 구현합니다. 예를 들어, 2007년 3월 10 경우, 읽어올 텍스트 파일은 weblog_20070310.txt로 설정되고, 대상 테이블도 LogDataTable_070310 형태로 설정되는 기능입니다.

 

8.         커스터마이징 작업 로그 설정 : 패키지, 작업 개체 별 시작 및 종료 및 처리 행 수 관리

- 만들어 놓은 패키지가 잘 돌아가는지 모니터링 하고 관리하는 작업 역시 개발만큼이나 중요한 작업 형태입니다. 기본적으로 SSIS에서는 다양한 로깅 기능이 제공되지만 이벤트 처리기를 이용해서 필요한 로깅 정보를 생성하는 기능을 구현합니다.

 

9.         작업 종료 및 실패 시 메일 통보 설정 : 이벤트 처리기 및 SMTP 메일 발송을 이용

- 매일 수행되는 작업이 정상적으로 종료되거나 실패로 처리가 될 경우, 관리자에게 메일로 통보하도록 설정하는 기능이나 자동 처리 프로세스를 이용하여 처리하도록 하는 기능을 구현합니다.

 

10.     SQL Agent 등록 및 모니터링

- 만들어진 패키지를 자동으로 수행하도록 SQL Agent에 등록하고 관리하는 방법에 대해 설명합니다.

 

 

반응형
반응형

SSIS 기타 사항

 

 

성능 카운터

 

SQL Server 2005에서는 SSIS와 관련된 기본 성능 카운터를 제공합니다.

 

 

[제어판] à [관리도구] à [성능]을 선택하여 성능 모니터를 띄웁니다. 성능 개체 중 SQLServer:SSIS PipelineSQLServer:SSIS Service SSIS의 성능을 모니터링 할 수 있는 카운터 입니다.

SQLServer:SSIS Service 개체에는 SSIS Package Instances라는 카운터만 존재하며 현재 수행되고 있는 SSIS 패키지의 개체 수를 나타냅니다.

 

SQLServer:SSIS Pipeline 개체의 카운터는 다음 표를 참고하시기 바랍니다. 이 개체는 데이터 흐름 작업에서의 성능에 대한 정보를 제공합니다. 현재 패키지가 사용하고 있는 메모리 버퍼의 크기라든지, 원본 또는 대상에서의 행 수, BLOB(Binary Large Object) 데이터의 통계 정보 등을 제공합니다.

 

성능 카운터

설명

BLOB bytes read

데이터 흐름 엔진이 모든 원본에서 읽어 온 BLOB(Binary Large Object) 데이터의 바이트 수입니다.

BLOB bytes written

데이터 흐름 엔진이 모든 대상에 기록한 전체 BLOB 데이터의 바이트 수입니다.

BLOB files in use

데이터 흐름 엔진이 스풀링을 위해 사용하는 BLOB 파일 수입니다.

Buffer memory

사용 중인 모든 유형의 메모리 버퍼 양입니다. 이 값이 물리적인 메모리의 양보다 크면 Buffers Spooled는 늘어나며 이는 메모리의 스와핑이 증가함을 나타냅니다. 메모리 스와핑이 증가하게 되면 데이터 흐름 엔진의 성능이 떨어집니다.

Buffers in use

데이터 흐름 엔진이 현재 사용 중인 모든 유형의 버퍼 개체 수입니다.

Buffers spooled

디스크에 쓰여진 버퍼 수입니다. 데이터 흐름 엔진에 물리적 메모리가 부족하면 현재 사용되지 않은 버퍼는 디스크에 쓰여지고 필요에 따라 다시 로드됩니다.

Flat buffer memory

모든 플랫 버퍼가 사용하는 전체 메모리(바이트)입니다. 플랫 버퍼는 구성 요소가 데이터 저장에 사용하는 메모리 블록입니다. 플랫 버퍼는 바이트의 큰 블록이며 바이트 단위로 액세스됩니다.

Flat buffers in use

데이터 흐름 엔진이 사용하는 플랫 버퍼 수입니다. 모든 플랫 버퍼는 전용 버퍼입니다.

Private buffer memory

모든 전용 버퍼가 사용하는 전체 메모리 양입니다. 데이터 흐름 엔진이 데이터 흐름을 지원하기 위해 만드는 버퍼는 전용 버퍼가 아닙니다. 전용 버퍼는 변환 작업에서 임시 작업용으로만 사용하는 버퍼입니다. 예를 들어 집계 변환은 전용 버퍼를 사용하여 내부 계산을 수행합니다.

Private buffers in use

변환 작업에서 사용하는 버퍼 수입니다.

Rows read

원본에서 생성하는 행 수입니다. 조회 변환이 참조 테이블에서 읽은 행은 포함되지 않습니다.

Rows written

대상에 제공된 행 수입니다. 대상 데이터 저장소에 쓰여진 행은 반영되지 않습니다.

 

성능 카운터에서의 Private bufferFlat buffer는 다음과 같습니다.

Ÿ           Private buffer정렬 변환이나 집계 변환 등과 같이 변환 작업 개체가 결과를 처리하기 위해 사용하는 임시 메모리 공간을 말합니다.

Ÿ           Flat buffer데이터 흐름 작업에서 데이터를 저장하는데 이용되는 메모리 공간을 말합니다. 예를 들어, 조회 변환에서 조회 테이블의 데이터를 저장시켜서 사용할 때 Flat buffer가 이용됩니다.

 

성능 카운터에서 제공하는 메모리와 관련된 정보를 이용하여 시스템 환경에 맞는 값을 설정하여 패키지의 처리 성능을 향상시킬 수 있습니다.

 

 

예를 들어, 현재 작업량에 비해 사용 가능한 메모리의 공간이 큰 경우, DefaultBufferSize의 크기를 늘릴 수도 있으며, Text형이나 Image 형과 같은 BLOB(Binary Large bject) 데이터의 처리가 많은 경우, BLOBTempStoragePath를 별도로 지정하여 처리 성능을 개선시킬 수도 있습니다.

 

 

 

 

SSIS에서의 메모리 제한

 

SSIS에서 사용 가능한 메모리의 최대 크기는 다음과 같습니다.

 

Bit 구분

옵션

최대 메모리

32bit Windows

boot.ini /3GB 옵션이 없는 경우

2 GB

boot.ini /3GB 옵션이 있는 경우

3 GB

64bit Windows

64bit process

16 TB

32bit WOW

4 GB

WOW(Windows on Windows) : 64bit 환경에서 32bit 응용 프로그램을 수행할 수 있도록 한 기술

 

※ 최대 메모리 크기는 개별 패키지 하나에 대한 제한 사항입니다. , 서버의 메모리가 4 GB 이상인 환경에서 2 GB 메모리를 사용하는 SSIS 패키지를 동시에 여러 개 수행 가능합니다.

 

SSIS Windows AWE(Address Windowing Extensions)를 사용하지 않습니다.

 

 

 

패키지 저장 방식에 따른 장점

 

SSIS에서는 기본적으로 세 가지 방식으로 패키지를 저장할 수 있습니다.

 

1.       SQL Server로 지정하게 되면 SQL Server msdb에 저장됩니다. 해당 패키지의 정보는 msdb.dbo.sysdtspackages90 테이블에 저장됩니다.

2.       파일 시스템으로 저장할 경우에는 사용자가 지정한 위치로 저장합니다.

3.       SSIS 패키지 저장소 역시 파일 형식으로 패키지를 관리하지만, 저장 위치는 서버의 특정 위치에 저장됩니다.
기본적으로 %ProgramFiles%\Microsoft SQL Server\90\DTS\Packages 에 저장됩니다.

 

, 패키지는 SQL Server에 저장되거나 파일로 저장되어 관리됩니다. 각각의 방식에 따른 장점은 다음과 같습니다.

 

Ÿ           파일로 저장하여 관리하는 방식의 장점

       연결 정보를 쉽게 공유하여 사용할 수 있습니다.

       보안 설정에서 사용자 키 기반의 암호화(EncryptSensitiveWithUserKey 또는 EncryptAllWithUserKey)로 설정한 경우, 매우 강력한 패키지 암호화를 구현할 수 있습니다. 이 경우, 해당 사용자의 프로필 환경 외에서는 패키지 수정이나 조회가 어렵습니다.

       네트워크 장애 또는 DB 장애 발생시에도 안전합니다.

       구성 파일이나 기타 파일들을 같이 관리하기가 용이합니다.

       패키지를 수정할 때 개발 환경으로 로드하는 작업이 간단합니다.

       파일로 관리되기 때문에 파일 시스템의 계층 구조를 이용하여 관리할 수 있습니다.

       Visual Studio의 프로젝트가 파일 형식으로 관리되기 때문에 프로젝트에 포함시켜 개발하기 용이합니다.

è , 자주 수정되거나 아직 최종적으로 개발 완료되지 않은 패키지 형태인 경우 파일 형태의 관리가 용이합니다.

 

Ÿ           SQL Server로 저장하여 관리하는 방식의 장점

       여러 사용자들이 공유하기가 편합니다.

       데이터베이스의 보안 기능을 사용하여 관리할 수 있습니다. SSIS 패키지의 운영이나 수정과 관련된 역할(Role)등을 적용할 수 있습니다.

       msdb DB에 테이블 형태로 저장되기 때문에 일반 DB 백업과 같은 방식으로 패키지를 백업하여 관리할 수 있습니다.

       SQL 쿼리를 이용하여 패키지에 대한 정보를 조회할 수 있습니다.

è , 자주 수정이 일어나지 않는 형태인 운영 환경에서는 SQL Server 형태의 관리가 용이합니다.

 

 

반응형
반응형

배포 및 배포 마법사

 

패키지를 개발한 후 서버에 등록시키거나 다른 환경에 배포하기 위해서는 단순히 .dtsx 파일을 서버의 특정 위치로 복사하거나 Visual Studio[파일] 메뉴 중, [다른 이름으로 저장], [복사본 저장] 등과 같은 메뉴를 이용하여 수행할 수 있습니다.

하지만, 프로젝트의 규모가 크거나 구성 정보를 포함하여 배포해야 할 경우에는 SSIS에서 제공하는 배포 마법사를 이용할 수 있습니다. 배포 마법사는 어플리케이션의 설치 파일과 같은 형식으로 패키지를 설치할 수 있는 형태로 만들어주는 기능입니다.

 

배포 마법사는 개별 패키지 수준이 아닌, 프로젝트 전체 수준으로 수행됩니다. 솔루션 탐색기의 프로젝트 명에서 속성(R)을 선택한 후 나타나는 속성 창에서 배포 유틸리티를 선택하면 됩니다.

 

 

 

 

Ÿ           AllowConfigurationChanges패키지를 배포할 때 구성 정보를 수정할 수 있도록 허용할 지의 여부를 설정합니다. 예를 들어, 파일 연결Connection 정보를 관리하는 구성 파일을 설정해놨을 때, AllowConfigurationChanges의 값을 True로 해서 배포 파일을 만들면, 배포 과정에서 구성으로 설정된 값에 대해 수정할 수 있는 부분이 나타납니다. 개발 서버와 운영 서버의 환경이 다른 경우 또는 연결 등을 변경해줘야 할 경우 이 옵션을 True로 설정하여 구성에서 관리하는 속성값을 변경할 수 있도록 합니다.

Ÿ           CreateDeploymentUtility패키지를 배포할 수 있는 유틸리티를 포함할 지를 설정합니다. 배포할 수 있는 유틸리티 파일은 확장자가 .SSISDeploymentManifest 인 형태입니다. 이 유틸리티를 사용하여 실행하면 배포 위치를 지정하거나 설정 등을 쉽게 지정할 수 있는 패키지 설치 마법사가 실행됩니다.



Ÿ           DeploymentOutputPath배포 파일과 유틸리티가 저장되는 폴더의 위치를 지정합니다. 기본적으로 프로젝트 파일이 있는 위치의 하위 폴더에 생성됩니다.

 

속성 패키지배포 유틸리티 부분에서 배포와 관련된 사항을 설정하였다 하더라도 패키지를 빌드하기 전에는 배포 파일이 생성되지 않습니다. 솔루션 탐색기에서 프로젝트 명을 오른쪽 클릭한 후, 빌드(U)를 선택하거나 Visual Studio의 상단 메뉴 중 빌드(B) 메뉴를 클릭하여 패키지를 빌드하면 배포 파일이 생성됩니다.

 

패키지 설치 마법사를 이용하여 개발된 패키지 파일을 쉽게 파일 시스템 또는 SQL Server에 배포시킬 수 있으며, 구성 정보에 대한 세부 항목의 설정을 변경할 수도 있습니다.

 

 

 

 

 

 

 

 

반응형
반응형

보안

 

SSIS에서는 강력한 패키지 보안 수준을 제공합니다. 기본적으로 SSIS에서 제공하는 보안과 관련된 사항은 다음과 같습니다.

Ÿ           패키지의 ProtectionLevel 설정에 따라 패키지의 암호화를 설정할 수 있습니다. 데이터베이스 암호나 연결 문자열 등과 같은 중요한 데이터를 포함시키지 않도록 설정하거나 암호화할 수준을 설정할 수 있습니다.

Ÿ           ProtectionLevel PackagePassword 속성을 이용하여 패키지의 보안을 설정할 수 있습니다. 패스워드를 이용하거나 개인 키를 이용하여 보안을 설정할 수 있습니다.

Ÿ           보안과 관련된 사항을 SQL Server가 담당하도록 지정할 수 있습니다. ProtectionLevelServerStorage로 설정한 후, 패키지를 서버의 msdb에 직접 저장하게 되면 패키지의 보안 관련된 사항은 모두 SQL Server에서 관리하게 됩니다.

 

 

패키지의 속성 중 ProtectionLevelPackagePassword를 이용하여 보안 설정을 구성할 수 있습니다.

 

설정값

상세 설명

DontSaveSensitive

(중요한 정보 저장 안 함)

패키지를 저장할 때 중요한 정보를 제외합니다. 이 보호 수준은 암호화는 사용하지 않지만 중요한 것으로 표시된 속성이 패키지로 저장되는 것을 방지하여 사용자가 중요한 데이터를 사용하지 못하도록 합니다. 이 설정은 동일한 사용자가 패키지를 저장하여 닫은 후, 다시 여는 경우라도 저장이 되지 않기 때문에 매번 패키지를 열 때마다 중요한 정보를 다시 지정해줘야 합니다.

EncryptAllWithPassword

(암호로 모두 암호화)

암호를 사용하여 전체 패키지를 암호화합니다. 패키지를 만들거나 내보낼 때 사용자가 입력한 암호를 사용하여 패키지를 암호화합니다. 사용자는 SSIS 디자이너에서 패키지를 열거나 dtexec 명령 프롬프트 유틸리티를 사용하여 패키지를 실행할 때 패키지 암호를 입력해야 합니다. 암호를 입력하지 않으면 패키지를 실행할 수 없습니다. 이 설정을 적용할 경우, PackagePassword 항목에 적절한 암호를 지정한 후 패키지를 저장해야 합니다.

EncryptAllWithUserKey

(사용자 키로 모두 암호화)

사용자 프로필을 기반으로 하는 암호를 사용하여 전체 패키지를 암호화합니다. 동일한 프로필을 사용하는 동일한 사용자만 패키지를 로드할 수 있습니다. 패키지를 만들거나 내보낸 사용자를 기반으로 하는 키를 사용하여 패키지를 암호화합니다. 패키지를 만들거나 내보낸 사용자만 SSIS 디자이너에서 패키지를 열거나 dtexec 명령 프롬프트 유틸리티를 사용하여 패키지를 실행할 수 있습니다.

EncryptAllWithPassword

(암호로 중요한 정보 암호화)

암호를 사용하여 패키지 내의 중요한 정보를 암호화합니다. 이 암호화에는 DPAPI가 사용됩니다. 중요한 데이터는 패키지의 일부로 저장되지만 패키지를 만들거나 내보낼 때 사용자가 입력한 암호를 사용하여 암호화됩니다. SSIS 디자이너에서 패키지를 열려면 패키지 암호를 입력해야 합니다. 암호를 입력하지 않으면 패키지의 중요한 정보가 제외되며 패키지를 실행시키기 위해서는 사용자가 중요한 정보 부분에 값을 입력해야 합니다. 암호를 입력하지 않으면 패키지를 실행할 수 없습니다. 이 설정을 적용할 경우, PackagePassword 항목에 적절한 암호를 지정한 후 패키지를 저장해야 합니다.

EncryptSensitiveWithUserKey

(사용자 키로 중요 정보 암호화)

현재 사용자를 기반으로 하는 키를 사용하여 패키지 내의 중요한 정보를 암호화합니다. 동일한 프로필을 사용하는 동일한 사용자만 패키지를 로드할 수 있습니다. 다른 사용자가 패키지를 여는 경우 중요한 정보는 빈칸으로 대체되므로 현재 사용자가 중요한 데이터에 새 값을 지정해야 합니다. 사용자가 패키지를 실행하려고 시도하는 경우 패키지 실행이 실패합니다. 이 암호화에는 DPAPI가 사용됩니다.

ServerStorage

(암호화에 서버 저장소 사용)

SQL Server 데이터베이스 역할을 사용하여 전체 패키지를 보호합니다. 이 옵션은 패키지를 SQL Server msdb 데이터베이스에 저장할 때만 지원됩니다. Business Intelligence Development Studio 에서 파일 시스템에 패키지를 저장하는 경우에는 지원되지 않습니다.

 

SSIS에서의 중요한 데이터(Sensitive Data)는 암호, 연결 문자열 등을 지칭합니다.

 

만약 EntryptAllWithUserKey 또는 EncryptSensitiveWithUserKey로 설정된 패키지를 다른 사용자의 프로필 환경에 열 경우 다음과 같은 오류가 발생합니다.

 

 

EncryptSensitiveWithUserKey 또는 EncryptSensitiveWithPassword로 설정된 패키지의 경우, 다른 사용자의 프로필 환경에서 열 경우 또는 암호가 틀릴 경우에는 중요한 데이터만 사용할 수 없으며, 나머지 패키지의 개체는 조회 가능합니다. 하지만, EncryptAllWithUserKey 또는 EncryptAllWithPassword 등으로 설정된 경우, 사용자 프로필이 다르거나 암호가 다르게 되면 다음과 같이 패키지의 개체 조회까지 불가능합니다.

 

 

 

패키지 운영 방안

 

다수의 개발자가 패키지의 내용을 조회하고 운영해야 하는 실제 운영 환경에서 SSIS 패키지를 개발하고 운영하기 위해서는 다음과 같은 운영 형태를 고려할 수 있습니다.

 

1.       모든 개발 패키지를 EncryptSensitiveWithPassword 또는 EncryptAllWithPassword로 설정한 후, 패키지의 암호를 공유합니다. 이 경우, 개인 키를 기반으로 하지 않기 때문에 패키지의 암호를 아는 사용자는 누구든지 접근이 가능하며 실행할 수 있습니다.

 

2.       개발자는 각 패키지를 개발한 후 최종 버전을 서버의 msdb에 저장합니다. 이 때 ProtectionLevelServerStorage로 설정한 후, Visual Studio의 상단 메뉴 중 [파일] à [다른 이름으로 … .dtsx의 복사본 저장]을 선택한 후, 패키지 위치를 SQL Server로 설정하여 직접 SQL 서버에 저장합니다.



저장한 패키지를 다른 사용자가 수정하거나 조회해야 할 경우, 개발 환경의 솔루션 탐색기에서 기존 패키지 추가(X) 메뉴를 이용하여 SQL Servermsdb에 저장된 패키지를 불러오는 방식으로 운영할 수 있습니다.

 

     

 

반응형
반응형

로깅

 

SSIS에는 패키지가 실행될 때의 이벤트 정보를 기록할 수 있는 로깅 기능을 제공합니다. 패키지가 시작되는 시간 및 종료되는 시간, 에러가 발생했을 때의 정보, 패키지 내의 개별 작업의 수행 시간 등 패키지를 관리하는데 필요한 여러 운영 기록을 남길 수 있습니다. SSIS에서 발생되는 모든 이벤트에 대해 로그를 남길 수 있으며, 각각의 이벤트에 대해 스키마라 불리는 열 정보에 이벤트와 관련된 사항이 저장됩니다.

 

이벤트 정보에 대한 스키마 정보는 다음과 같습니다.

요소

설명

Computer

로그 이벤트가 발생한 컴퓨터의 이름입니다.

Operator

패키지를 시작한 사용자의 ID입니다.

SourceName

로그 이벤트가 발생한 컨테이너 또는 작업의 이름입니다.

SourceID

로그 이벤트가 발생한 패키지, For Loop, Foreach Loop, 시퀀스 컨테이너 또는 작업의 고유 식별자입니다.

ExecutionID

패키지 실행 인스턴스의 GUID입니다.

MessageText

로그 항목과 관련된 메시지입니다.

DataBytes

로그 항목과 관련된 바이트 배열입니다. 이 필드의 의미는 로그 항목에 따라 다릅니다.

 

 

스키마 정보 외에도 이벤트 명, 이벤트 발생 시작 시간, 이벤트 종료 시간이 기록됩니다.

 

하나의 패키지 내에 있는 모든 작업에 대해 일괄적으로 로그를 남길 수도 있으며, 필요한 작업에 대해서만 로그를 남기도록 설정할 수도 있습니다.

 

 

 

로그 설정

 

패키지 또는 각 개체의 속성에는 해당 개체에 대한 로깅 설정을 할 수 있는 LoggingMode라는 항목이 있습니다.

 

 

기본값은 UseParentSetting이며, 현재 작업 개체가 포함된 컨테이너의 로그 설정을 따른다는 의미입니다. LoggingMode 값을 Disable로 설정하게 되면 패키지에서 로그를 남기도록 설정을 하여도 로그 정보를 발생시키지 않습니다.

 

 

 

로그 구성

 

로그를 구성하기 위해서는 Visual Studios 개발 화면 상단에 있는 SSIS(S) 메뉴에서 로깅(L)을 클릭합니다.

 

 

위의 그림과 같이 로그를 구성할 수 있는 창이 나타납니다. 왼쪽의 컨테이너(C) 부분에서는 패키지 내에서 로그를 남길 요소를 선택합니다. 상위 개체가 선택되면 자동으로 하위 개체는 로그를 남기게 되며 비활성화 됩니다. 만약 일부 작업에 대해서만 로그를 남기도록 설정할 경우, 이 부분에서 해당 개체에 대해서만 선택하면 됩니다.

 

공급자 및 로그 탭에서 로그를 남길 유형을 설정할 수 있습니다.  위의 그림과 같이 텍스트 파일이나 프로파일러용 로그파일, XML 파일 등 다양한 형태의 로그 유형을 설정할 수 있습니다. 각 유형에 대한 예는 아래 부분에서 자세히 살펴보도록 하겠습니다.

 

 

 

자세히 탭에서는 로그를 남길 이벤트를 선택할 수 있으며, 아래에 있는 고급(N)>> 버튼을 누르면 각 이벤트에 대해 저장할 열 정보(스키마 정보)를 선택할 수 있습니다.

 

또한 저장(S)을 이용하여 현재 구성한 로그 설정 사항을 XML 형태의 파일로 저장할 수 있으며, 이미 저장된 로그 구성 파일이 있는 경우, 로드(L)을 이용하여 불러올 수 있습니다.

 

 

 

로그 유형

 

SSIS에서는 기본적으로 5개의 로그 공급자 유형을 제공합니다. 동시에 여러 로그 공급자를 설정하여 로그를 남길 수도 있습니다. 로그를 남길 유형을 추가한 후, 해당 로그를 선택하고 구성을 눌러 로그 공급자가 사용할 로그 파일에 대한 연결을 설정해 줘야 합니다. 텍스트 파일용 로그 공급자SQL 프로파일러용 SSIS 로그 공급자, XML 파일용 로그 공급자인 경우에는 파일 연결 관리자를 이용하여 로그 파일을 지정해 주며, SQL Server SSIS 로그 공급자인 경우에는 OLE DB 연결 관리자를 이용해서 지정해 줘야 합니다.

 

 

1.      텍스트 파일용 SSIS 로그 공급자 – CSV(쉼표로 구분된 형태) 파일로 저장됩니다. 일반 메모장과 같은 텍스트 편집기에서 확인할 수 있으며, 엑셀에서 해당 파일을 읽어올 수도 있습니다.



2.      SQL 프로파일러용 SSIS 로그 공급자 – SQL Server 2005 프로파일러에서 읽어올 수 있는 형태의 로그 파일을 생성합니다. 기본 확장자는 .trc 입니다.



3.      SQL Server SSIS 로그 공급자 로그 구성 화면에서 설정된 OLE DB 연결에 해당하는 DBsysdtslog90이라는 테이블이 생성되며 이 테이블에 로그 정보를 기록합니다. 이미 DB에 이 테이블이 있는 경우에는 새로 생성하지는 않습니다. 테이블에 저장된 로그의 경우 SQL 쿼리를 이용해서 쉽게 조회하고 관리할 수 있는 장점이 있습니다.



4.      Windows 이벤트 로그용 SSIS 로그 공급자 – Windows의 이벤트 로그 정보에 로그 정보가 기록됩니다. Microsoft Operations Manager나 이와 비슷한 로그 파일을 관리하는 프로그램을 사용하는 경우, 다른 어플리케이션의 로그와 같이 관리할 수 있는 장점이 있습니다.



5.      XML 파일용 SSIS 로그 공급자 – XML 형태의 파일로 로그 정보가 기록됩니다. XML 형태로 저장된 파일은 XML Viewer나 기타 관리 프로그램을 이용하여 쉽게 관리할 수 있으며, SQL 쿼리문을 통해서도 쉽게 조작할 수 있는 장점이 있습니다.



 

 

 

SSIS의 로깅 기능은 매우 간편하고 다양한 정보를 남길 수 있는 장점이 있습니다. 하지만, 다양하고 세밀하게 설정할 수 있는 반면 사용자가 쉽고 간결하게 결과를 조회하기에는 부족한 부분이 있습니다. 필자의 경험으로는 가장 단순하면서도 필요한 기능으로, 패키지의 시작 / 종료 시간, 소요 시간, 패키지 내의 개별 작업들에 대한 시작 / 종료 시간을 쉽게 조회하는 것이었습니다. 위에서 설명한 로깅 기능을 이용하더라도 이러한 결과를 구할 수는 있지만, 이벤트 처리기를 통해 보다 간결하게 결과를 생성할 수 있습니다. 실제 운영환경에서 효과적으로 사용할 수 있는 로그 관리 기능은 별도의 강좌를 통해 소개하도록 하겠습니다.

 

 

반응형
반응형

트랜잭션

 

SQL Server에서와 같이 SSIS에서도 데이터베이스 작업에 대해 트랜잭션을 지원합니다. 하나의 트랜잭션으로 설정된 여러 작업들이 있을 때, 모든 작업이 성공할 때에만 커밋되고 그렇지 않을 때에는 전체 작업이 다 롤백 되도록 설정할 수 있습니다. 이는 패키지 전체 또는 트랜잭션이 필요한 작업 영역에 대해 데이터 무결성을 유지 관리할 수 있는 기능입니다.

 

트랜잭션의 속성은 각 작업 개체 또는 컨테이너, 패키지의 속성 중 TransactionOption 에서 설정할 수 있습니다.

 

 

 

[참고] 트랜잭션을 사용하기 위한 설정 – DTC(Distributed Transaction Coordinator) 실행

 

SSIS에서 트랜잭션을 사용하기 위해서는 패키지가 수행되는 서버 또는 PC MSDTC 서비스가 실행되고 있어야 합니다.

DTC 서비스가 실행되고 있지 않은 상태에서 트랜잭션 설정을 적용한 패키지를 수행하면 진행률 부분에서 다음과 같은 메시지가 나타납니다.

 

 

DTC 서비스는 [제어판] à [관리도구] à [서비스] 내에서 Distributed Transaction Coordinator 서비스를 시작하면 실행됩니다.

 

 

 

 

SSIS의 모든 작업 개체 및 컨테이너의 속성에서 TransactionOption을 설정할 수는 있지만, 트랜잭션 기능은 데이터베이스와 관련된 작업에 대해서만 적용됩니다. 예를 들어 아래 그림과 같이 작업 1작업 3SQL 실행 작업이며, 작업 2는 파일 복사를 수행하는 파일 시스템 작업일 때, 작업 3에서 실패가 나서 해당 컨테이너가 커밋을 하지 못할 경우 작업 1SQL 작업은 롤백이 일어나서 데이터 처리가 되지 않지만, 작업 2인 파일 복사 작업은 롤백이 되지 않습니다. , 이미 복사가 이루어진 파일이 다시 삭제되지는 않습니다.

 

  (작업 1, 작업 2, 작업 3  | TransactionOption : Supported)

 

하지만, 데이터베이스와 관련된 작업이 아닌 경우에도 트랜잭션이 필요한 이유는 다음과 같습니다.

 

작업 1작업 2는 데이터베이스와 관련된 작업이며, 작업 3은 파일을 복사하는 작업입니다. 세 개의 작업이 트랜잭션을 생성시키는 하나의 컨테이너 내에서 수행된다고 할 때, 데이터베이스 작업이 아닌 작업 3에서 실패가 나더라도 작업 1작업 2는 롤백이 됩니다.

 

(작업 1, 작업 2, 작업 3  | TransactionOption : Supported)

 

이는 작업 3작업 1이나 작업 2와 같이 트랜잭션의 처리 결과에 대해 커밋이나 롤백을 수행할 대상은 아니지만, 트랜잭션에 영향을 미칠 수 있는 개체로 설정되어 있기 때문입니다.

 

 

트랜잭션에서 설정할 수 있는 옵션은 다음과 같습니다.

 

Ÿ           Required현재 개체가 트랜잭션을 생성합니다. 여기서의 개체는 패키지 또는 컨테이너, 개별 작업을 말합니다. 만약 이 개체가 부모 컨테이너에 포함되어 있으며, 부모 컨테이너에서 트랜잭션이 생성되도록 설정되어 있는 경우에는 Supported 설정과 같이 부모의 트랜잭션에 참여합니다.
 
패키지는 트랜잭션을 생성하지 않는 Not Required로 설정되어 있더라도, 패키지 내에 있는 시퀀스 컨테이너의 트랜잭션 속성이 Required로 설정된 경우, 시퀀스 컨테이너는 트랜잭션을 생성하며, 이 컨테이너 내에 포함되는 작업들(
Not Supported로 설정된 작업 제외)에 대해 트랜잭션을 적용합니다.

Ÿ           Supported현재 개체가 트랜잭션을 생성하지는 않고 단지 부모 컨테이너의 트랜잭션에 참여만 합니다. 예를 들어, 패키지는 트랜잭션을 생성하는 Required로 설정이 되어 있으며, 패키지 내에 포함된 3개의 SQL 작업들의 트랜잭션 옵션은 Supported로 설정되어 있는 경우, 각각의 SQL 작업은 부모 컨테이너인 패키지의 트랜잭션에 참여하게 되며, 세 개의 작업 중 하나라도 실패하게 되면 전체 작업이 롤백 됩니다.

Ÿ           Not Required현재 개체가 새로운 트랜잭션을 생성하지도 않으며, 기존 트랜잭션에 참여하지도 않습니다.

 

 

다양한 경우를 예로 들어 설명하겠습니다.

 

우선 예제 설명을 위해 다음과 같은 예제 패키지를 구성합니다.

 

1.       새로운 패키지 파일을 하나 추가한 후, 임의의 데이터 베이스 연결을 설정합니다. 본 예제에서는 localhost tempdb를 사용하도록 하겠습니다.

 

2.       1에서 설정한 데이터베이스에 다음과 같은 형태의 간단한 테이블을 추가합니다.

CREATE TABLE TestTable

(

             SEQ INT

)

 

3.       제어 흐름 영역에 시퀀스 컨테이너를 하나 추가한 후, 시퀀스 컨테이너 내에 SQL 실행 작업 세 개를 추가한 후, 세 개의 작업을 연결합니다. 또한 시퀀스 컨테이너 밖에 SQL 실행 작업을 하나 더 추가합니다. 이 작업은 시퀀스 컨테이너와 연결시키지는 않습니다.

4.       SQL 작업의 속성에서 Connection 1에서 설정한 연결로 지정해 주고, SQLStatement에 다음과 같은 형태의 쿼리를 입력합니다.

      
작업 1 : INSERT TestTable VALUES(1)
      
작업 2 : INSERT TestTable VALUES(2)
      
작업 3 : INSERT TestTable VALUES(‘c’)
      
작업 4 : INSERT TestTable VALUES(4)




다음과 같은 형태의 패키지가 완성되었습니다. 작업 3에서는 int 형의 열에 ‘c’라는 자형 데이터를 입력하기 때문에 에러가 발생됩니다.

 

 

 

 

CASE 1) 트랜잭션 발생 없음

 

개체

TransactionOption

Package

Supported

시퀀스 컨테이너

Supported

작업 1

Supported

작업 2

Supported

작업 3

Supported

작업 4

Supported

 

 

 

최상위 컨테이너인 패키지 및 시퀀스 컨테이너 모두 Supported로만 설정되어 있기 때문에 어떠한 트랜잭션도 생성되지 않습니다. 따라서, 작업 1과 작업 2, 작업 4가 트랜잭션에 참여 없이 정상적으로 커밋됩니다.

 

 

 

CASE 2) 상위 레벨에서 트랜잭션 발생

 

개체

TransactionOption

Package

Required

시퀀스 컨테이너

Supported

작업 1

Supported

작업 2

Supported

작업 3

Supported

작업 4

Supported

 

 

 

최상위 컨테이너인 패키지의 설정이 Required이기 때문에 패키지 수준의 트랜잭션을 발생시켰으며, 패키지에 포함된 컨테이너는 Supported로 설정되어 있기 때문에 트랜잭션에 참여합니다. 또한 작업 1, 2, 3, 4도 마찬가지로 이 트랜잭션에 참여하게 됩니다. 따라서 작업 3이 실패가 나면, 해당 트랜잭션이 롤백되고 이 트랜잭션에 포함되어 컨터이너 내의 작업 1, 작업 2뿐만 아니라, 패키지에 포함된 작업 4도 커밋하지 못하고 롤백하게 됩니다.

 

 

 

CASE 3) 상위 레벨에서 트랜잭션 발생하지만, 컨테이너에서 트랜잭션 미 지원

 

개체

TransactionOption

Package

Required

시퀀스 컨테이너

Not Required

작업 1

Supported

작업 2

Supported

작업 3

Supported

작업 4

Supported

 

 

 

상위 수준인 패키지에서는 트랜잭션을 발생시키지만, 컨테이너에서는 트랜잭션을 지원하지 않도록 설정한 상태입니다. , 상위 레벨에서 트랜잭션이 생성되었더라도 컨테이너 내부의 개체인 작업 1, 2, 3은 참여를 하지 않습니다. 따라서 작업 1작업 2는 수행된 후, 바로 커밋됩니다. 하지만, 작업 3의 실패로 인해 트랜잭션 테스트 컨테이너의 최종 수행 결과는 실패로 처리가 되며, 이로 인해 패키지 수준에서 생성된 트랜잭션은 자식 개체인 시퀀스 컨테이너의 수행 결과가 실패이기 때문에 트랜잭션을 실패로 처리하게 되어 작업 4는 롤백됩니다.

 

 

 

CASE 4) 컨테이너에서 트랜잭션 생성

개체

TransactionOption

Package

Supported

시퀀스 컨테이너

Required

작업 1

Supported

작업 2

Supported

작업 3

Supported

작업 4

Supported

 

 

패키지 수준에서는 Supported로 설정되어 있기 때문에 트랜잭션을 발생시키지는 않습니다. 시퀀스 컨테이너의 설정이 Required이기 때문에 컨테이너에서 트랜잭션을 발생시키고, 해당 컨테이너에 포함되어 있는 작업 1, 2, 3은 모두 트랜잭션에 참여하게 됩니다. 따라서 작업 3의 실패로 인하여 시퀀스 컨테이너 수준의 트랜잭션은 실패가 되어 작업 1작업 2는 롤백합니다. 작업 4는 트랜잭션에 참여하지 않았기 때문에 바로 커밋되었습니다.

 

 

반응형
반응형

이벤트 및 이벤트 처리기

 

SSIS의 개발 환경이 Visual Studios에 통합되면서 다양한 부가 기능이 추가되었습니다. 그 중에서 이벤트이벤트 처리기 기능은 패키지 개발 및 운영 단계에서 매우 유용하게 사용할 수 있는 기능입니다.

 

SSIS 패키지를 VB.net이나 VC++ 등과 같은 어플리케이션이라 생각해 봅시다. 어플리케이션 소스 내의 클래스 또는 함수, 개체 등이 호출되어 실행될 때 다양한 이벤트가 발생합니다. 예를 들어 클래스가 생성되거나 실행될 때에는 OnCreate 또는 OnExecute 등과 같은 이벤트가 발생되며 에러가 발생될 때에는 OnError 이벤트가 발생됩니다.

 

SSIS 패키지도 이와 같은 개념으로 패키지 전체 및 개별 패키지가 실행될 때 이벤트가 발생됩니다. 여러 이벤트 중, OnError 이벤트를 고려해 보겠습니다. 패키지에서 지정한 위치에서 에러가 발생했을 때 OnError 이벤트가 발생되며, 시스템 변수에 저장된 이벤트 상세 정보를 이용하여 에러 처리 프로세스를 실행하도록 할 수 있습니다.

 

다음은 SSIS 패키지에서 발생되는 이벤트의 종류 및 간략한 설명입니다.

 

종류

이벤트

OnError

이 이벤트는 오류가 발생할 때 실행 개체에 의해 발생합니다.

OnExecStatusChanged

이 이벤트는 실행 상태가 변경될 때 실행 개체에 의해 발생합니다.

OnInformation

이 이벤트는 정보 보고를 위한 실행 개체의 유효성 검사 및 실행 중에 발생합니다. 이 이벤트에는 오류 또는 경고를 제외한 정보만 포함됩니다.

OnPostExecute

이 이벤트는 실행을 마친 바로 다음 실행 개체에 의해 발생합니다.

OnPostValidate

이 이벤트는 유효성 검사가 완료될 때 실행 개체에 의해 발생합니다.

OnPreExecute

이 이벤트는 실행되기 바로 전에 실행 개체에 의해 발생합니다.

OnPreValidate

이 이벤트는 유효성 검사가 시작될 때 실행 개체에 의해 발생합니다.

OnProgress

이 이벤트는 실행 개체의 진행 상태를 측정할 수 있는 경우 실행 개체에 의해 발생합니다.

OnQueryCancel

이 이벤트는 실행 중지 시기를 결정하기 위해 실행 개체에 의해 발생합니다.

OnTaskFailed

이 이벤트는 작업이 실패할 때 해당 작업에 의해 발생합니다.

OnVariableValueChanged

이 이벤트는 변수 값이 변경될 때 실행 개체에 의해 발생합니다. 이 이벤트는 변수가 정의되는 실행 개체에 의해 발생합니다. 변수에 대한 RaiseChangeEvent 속성을 False로 설정한 경우에는 이 이벤트가 발생하지 않습니다.

OnWarning

이 이벤트는 경고가 발생할 때 실행 개체에 의해 발생합니다

 

 

SSIS 개발 화면의 상단에 있는 이벤트 처리기 부분에서 이벤트에 대한 처리 작업을 수행할 수 있습니다. 왼쪽의 실행 파일 부분에서는 이벤트 처리기가 작동될 범위를 지정하며, 오른쪽의 이벤트 처리기 부분에서는 처리할 이벤트를 선택할 수 있습니다.

 

예를 들어 위의 그림의 경우, [데이터 흐름 작업]에 대한 OnError 이벤트를 처리하는 처리기를 선택한 것입니다.

 

각 이벤트 처리 수준은 계층으로 관리됩니다. 예를 들어, 전체 패키지 수준(위 그림에서는 MergeJoinSample)으로 OnError 이벤트 처리기를 설정하였다면, 이 이벤트 처리기는 패키지에서 발생하는 모든 에러 이벤트(OnError 이벤트)에 대해 수행하게 됩니다. 위의 그림과 같이 [데이터 흐름 작업]에 대한 OnError 이벤트 처리기를 설정한 경우, [데이터 흐름 작업]에 포함된 여러 작업이나 변환에서 발생한 OnError 이벤트만 처리하게 됩니다.

 

이벤트 처리기 작업 영역에서는 제어 흐름 영역이나 데이터 흐름 영역에서보다 훨씬 많은 시스템 변수를 제공합니다. 이는 발생된 이벤트의 세부 정보를 전달하기 위함입니다. 예를 들어, OnError 이벤트가 발생한 경우, 어떤 작업 개체 ID에서 발생되었으며([시스템::TaskID]), 에러 코드는 무엇이며([시스템::ErrorCode]), 에러 처리기가 시작된 시간이 언제인지([시스템::EventHandlerStartTime]) 등의 정보가 저장됩니다.

 

 

개발자는 이러한 시스템 변수에 저장된 값을 이용하여 이벤트 처리 작업을 구성할 수 있습니다.

 

 

이벤트 처리기를 이용한 작업의 예는 다음과 같습니다.

1.       앞서 언급한 바와 같이 패키지 내에서 에러가 발생되었을 때, 이를 처리하기 위한 용도로 사용될 수 있습니다. 예를 들어, FTP를 이용하여 파일을 가져오는 작업인 경우, 파일이 존재하지 않아서 에러가 발생되었을 때, OnError 이벤트 처리기를 이용하여 파일이 존재하지 않은 여러 가지의 이유를 확인하여 관리자에게 통보하는 작업을 구성할 수 있습니다.

2.       OnPreExecute, OnPostExecute 이벤트 처리기를 이용하여 패키지 전체 및 개별 작업의 시작 시간 및 종료 시간을 기록하는 작업을 구성할 수 있습니다. 패키지 전체 수준에서만 이러한 작업을 구성해 놓으면, 패키지 내에 여러 개의 작업 개체가 추가되더라도 별도의 작업 없이도 자동으로 수행 시간의 기록이 발생되어 관리 될 수 있습니다.

3.       OnVariableValueChanged 이벤트 처리기를 이용하여 패키지 내의 사용되는 변수의 값이 변경되는 사항을 관리할 수 있습니다. 이러한 정보는 변수 기반으로 한 패키지를 구성하였을 때, 어떠한 변수 값을 이용하여 패키지가 처리되었는지를 관리하는 데 사용할 수 있습니다.

4.       OnProgress 이벤트 처리기를 이용하여 각 작업의 실행중인 상태를 모니터링 할 수 있습니다. 예를 들어 데이터 변환 작업에 대해 이벤트 처리기를 구성한 경우, 현재 처리된 데이터의 처리량을 모니터링 할 수 있습니다.

 

 

반응형
반응형


데이터 흐름 경로

 

데이터 흐름 경로데이터 흐름 영역 내에서 변환과 변환, 또는 원본과 변환, 변환과 대상간의 연결을 시켜주는 경로입니다. 앞의 강좌에서 다룬 제어 흐름 영역의 선행 제약 조건에서는 여러 가지 옵션을 설정할 수 있었던 것에 비해 데이터 흐름 경로에서는 특별한 설정은 없습니다. 단지 데이터가 변환되어 처리되는 과정에서의 열 유형과 같은 메타 데이터를 확인할 수 있으며, 데이터 뷰어 라는 기능을 이용하여 개발 또는 디버깅 단계에서 처리되는 데이터를 쉽게 확인할 수 있는 기능만을 제공합니다.

 

 

데이터 흐름 경로에는 정상적인 변환 결과를 출력하는 경로(녹색)와 오류 정보를 출력하는 경로(붉은색)가 있습니다. 오류 출력을 추가한 경우에는 원본 또는 변환의 오류 구성 설정에서 오류가 발생할 열에 대해 행 리디렉션을 설정해 줘야 합니다.

 

데이터 흐름 경로는 다음과 같이 세 가지의 탭으로 구성되어 있습니다.

 

 

일반 탭에서는 특별한 설정 사항은 없으며, PathAnnotation을 이용해서 경로의 설명을 표시할 방법을 설정합니다.

 

메타데이터 탭에서는 현재의 데이터 흐름 경로를 지나는 데이터의 유형이나 자릿수 등과 같은 메타 데이터를 확인할 수 있습니다.

 

 

데이터 뷰어 탭에서는 데이터 흐름 경로를 지나는 데이터를 확인할 수 있는 데이터 뷰어를 설정할 수 있습니다. 데이터 뷰어는 패키지를 개발하거나 디버깅 하는 단계에서 사용되며, 개발 단계에 추가되었더라도 실제 운영 환경에서 수행될 때에는 작동하지 않습니다.

 

 

하나의 데이터 흐름 경로에는 여러 개의 데이터 뷰어를 설정할 수 있습니다.

데이터 뷰어는 , 히스토그램, 산점도(x,y), 세로 막대형 차트와 같이 4가지 형태로 사용할 수 있습니다.

단순히 처리되는 데이터의 형태를 표 형태로 보고자 할 때에는 유형을 사용하며, 데이터의 분포도 등을 확인하고자 할 때에는 산점도(x,y) 또는 세로 막대형 차트 유형을 사용할 수 있습니다.

 

 

다음은 각 유형별 출력 예 입니다.

Ÿ           전체 열을 출력하도록 설정한 예입니다. 확인이 필요한 열만 출력하도록 설정할 수도 있습니다.



Ÿ           히스토그램 – XVal 열에 대한 히스토그램을 설정한 예 입니다.



Ÿ           산점도(x,y) – XVal, YVal열에 대해 산점도를 설정한 예 입니다.



Ÿ           세로 막대형 차트 - YVal열에 대해 차트를 설정한 예 입니다.



 

데이터 뷰어를 통해 한 번에 출력되는 데이터의 양은 데이터 흐름 작업 영역의 속성 중 DefaultBufferMaxRows DefaultBufferSize의 값에 따라 달라집니다. 예를 들어, 전체 처리되는 데이터가 1,000,000건이더라도 DefaultBufferMaxRows의 값이 10,000으로 설정되어 있다면 데이터 뷰어에서 조회되는 데이터는 10,000개씩 나눠서 확인됩니다. 또한, DefaultBufferMaxRows의 값이 10,000이더라도 데이터 한 행의 크기가 커서 10,000개의 행이 처리되기 이전에 전체 데이터의 크기가 DefaultBufferSize를 넘어서는 경우, 해당 크기만큼의 데이터만 출력됩니다. 데이터 뷰어 창의 왼쪽 상단에 있는 버튼을 클릭하면 다음 처리 버퍼의 내용이 출력되며, 어느 정도 데이터 검증이 끝난 경우, 분리(D) 버튼을 클릭하면 데이터 확인 작업을 종료하고 데이터 처리를 계속 진행하게 됩니다. 데이터 복사(C)를 클릭하면 현재 데이터 뷰어 창에 나타난 데이터 또는 그래프에서 이용되는 데이터를 클립보드로 복사하게 됩니다.

 

기존 버전에 비해 SSIS는 변환 작업 간의 데이터 유형을 엄격히 일치시키도록 관리합니다. 이는 개발자의 실수로 인해 원하지 않는 데이터 변형이 발생되어 데이터가 잘못되는 현상을 막기 위한 것일 수도 있습니다. 따라서, 변환과 변환 간의 메타 정보를 확인해야 할 때, 데이터 흐름 경로를 이용하여 쉽게 확인할 수 있습니다. 또한, 설정한 변환 작업이 정상적으로 작동하는지를 바로 확인할 수 있기 때문에 개발 및 디버깅의 시간을 많이 단축할 수도 있습니다.

 

반응형
반응형

선행 제약 조건

 

선행 제약 조건은 이전 작업의 수행 결과를 이용하여 다음 작업의 수행을 제어합니다. 우선 선행 제약 조건을 살펴보기에 앞서 SSIS에서의 경로에 대해 잠시 설명하겠습니다. SQL 2000 DTS에서는 작업과 작업을 연결하는 경로는 한 종류만 있었습니다.

 

 

 

앞의 작업이 성공 또는 실패, 완료에 따라 다음 작업의 수행 여부를 설정하였습니다. 위의 그림에서 [작업설정]이라는 ActiveX 스크립트 작업이 성공으로 끝나는 경우(녹색), 다음 작업인 [테이블 Clear 작업]을 수행하라고 설정된 상태입니다.

 

SSIS에서는 제어 흐름데이터 흐름에도 경로가 있습니다.

 

 

 

 

제어 흐름 영역에서의 경로가 본 강좌에서 설명할 선행 제약 조건이며, 데이터 흐름 영역에서의 경로는 이와는 다른 데이터 흐름 경로입니다.

(데이터 흐름 경로는 다음 강좌를 참고하시기 바랍니다.)

 

SSIS선행 제약 조건DTS에서와 마찬가지로 이전 작업이 성공일 때 수행하도록 할 경우에는 녹색 선, 실패일 때 수행하도록 할 경우에는 붉은색 선, 성공 이나 실패의 여부에 상관없이 완료되었을 때 수행하도록 할 경우에는 파란색 선으로 표시됩니다. 하지만, 이러한 제약 조건과 더불어 을 이용하여 판단하는 기능이나 여러 제약 조건에 대한 처리 기능이 추가되었습니다.

 

에 대해 간단히 설명하면 다음과 같습니다. 만약 선행 작업이 데이터를 변환하는 작업일 경우, 데이터 변환 작업의 성공 여부뿐만 아니라, 변환된 행 수에 따라 이 후 작업의 실행 여부를 설정해야 할 경우가 있습니다. , 변환된 행 수가 최소한 100건 이상인 경우에만 다음 작업을 수행하도록 할 경우, [성공]이라는 제약 조건[행 수가 100보다 커야 한다]라는 을 같이 이용하여 다음 작업 실행 여부를 판단하도록 하는 것입니다.

 

 

 

제어 흐름 영역에서의 연결 선을 더블 클릭하면 위와 같은 선행 제약 조건 편집기가 나타납니다.

 

평가 작업(E)제약 조건에 대한 유형을 설정합니다.

Ÿ           제약 조건 단순히 이전 작업의 수행 결과가 성공, 실패, 완료인지에 따라 다음 작업의 실행 여부가 결정됩니다. 이 옵션을 선택할 경우, 자동으로 아래의 (X)부분은 비활성화 됩니다.

Ÿ           이전 작업의 성공, 실패, 완료 여부와는 상관없이 (X) 부분에서 정의된 조건식의 여부에 따라 다음 작업의 실행 여부가 결정됩니다.

Ÿ           식 및 제약 조건 이전 작업의 수행 결과와 조건식이 모두 만족할 때에만 다음 작업이 실행되도록 설정합니다. 예를 들어, 위의 그림에서 앞 부분의 작업이 수행되면 행 수가 [사용자::RowCount]라는 SSIS 내의 사용자 변수에 저장이 됩니다. 이 경우, 앞 부분의 작업 수행 여부도 성공이어야 하며, RowCount에 저장된 값이 RowThreshold라는 변수에 저장된 값보다 크거나 같은 경우에만 다음 단계를 실행하도록 설정한 것입니다.

Ÿ           식 또는 제약 조건 이전 작업의 수행 결과 또는 조건식 중 하나라도 만족하는 경우, 다음 작업이 실행되도록 설정합니다.

 

(X)에서 사용자 변수는 위에서와 같이 @변수명 형태로 설정해야 합니다. 조건식을 작성한 후, 테스트(T)를 이용하여 작성한 조건식이 유효한지를 확인할 수 있습니다.

 

여러 제약 조건 또한 SSIS에서 새롭게 추가된 기능입니다. 예를 들어 하나의 작업에 여러 선행 작업이 설정되어 있을 경우,

             모든 선행 작업의 제약 조건이 모두 True가 되어야 다음 작업을 수행하도록 할 지,         - 논리적 AND

또는

여러 작업들 중 하나라도 만족하면 다음 작업을 수행하도록 할 지                                  - 논리적 OR

를 설정합니다.

 

다음 그림에서 [실패]라는 스크립트 작업에 대해 [테이블 행 수 계산][성공] 스크립트 작업이 선행 작업으로 설정되어 있습니다. 이 때 [테이블 행 수 계산] 작업이 실패하거나, [성공] 스크립트 작업이 성공적으로 수행되는 경우 [실패] 스크립트 작업이 수행되도록 설정한 것입니다.

 

 

논리적 AND인 경우에는 실선으로 표시되며, 논리적 OR인 경우 위의 그림과 같이 점선으로 표시됩니다.

 

 

단순히 성공, 실패, 완료만을 설정했던 이전 버전에 비해 다양해진 추가 기능으로 인해 선행 제약 조건의 설정 작업이 조금 복잡할 수 있습니다. 하지만, 다양한 형태의 작업 경로를 구현할 수 있다는 점에서 매우 우수한 기능이라 할 수 있습니다.

 

 

 

반응형

+ Recent posts

반응형