반응형
Event Log를 활용해보자. (응용 편)

백도훈

에이디컨설팅 선임 컨설턴트
 


 

1.       Temp라는 이름의 Int32 변수 생성합니다.

2.       SQL 실행 작업 추가하겠습니다.

3.       Connection 속성으로 아무 DB에나 연결해주세요.

4.       SQLStatement 속성에 아래의 쿼리를 입력합니다.

select 1 as V where 1 = 0

5.       ResultSet 속성을 단일 행으로 선택합니다.

6.       결과 집합 메뉴에서 결과 이름을 V, 변수 이름은 Temp 설정해주세요.

 

 

7.       , 이제 상단의 이벤트 처리기 탭을 선택해서 에러가 발생했을 수행할 작업을 설정해보도록 하겠습니다.

8.       실행 파일은 패키지를 선택해주시고 이벤트 처리기는 OnError 선택해주세요.
저의 경우에는 패키지 명이 ADEventLog.dtsx였기 때문에 아래와 같은 상태입니다.

 

 

9.       화면에서 스크립트 작업 추가합니다.
스크립트 메뉴의 ReadOnlyVariables 속성에 다음과 같은 변수를 설정합니다.
SourceName, PackageName, ErrorDescription
왠지 너무 급하게 같아서 여기까지 작업을 한데 모아서 인증 샷을 찍겠습니다.


별로 감흥이 없군요 -,.a

 

10.    계속 갑니다. 스크립트 디자인 버튼을 클릭하여 VS for App 창을 열고 아래의 소스를 입력합니다.

Imports System

Imports System.Data

Imports System.Math

Imports Microsoft.SqlServer.Dts.Runtime

Imports System.Diagnostics

 

Public Class ScriptMain

    Public Sub Main()

        Dim PackageName As String = "P_" + Dts.Variables("PackageName").Value.ToString

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

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

 

        If Not EventLog.SourceExists(PackageName) Then

            EventLog.CreateEventSource(PackageName, "SSIS Log")

        End If

 

        EventLog.WriteEntry(PackageName, SourceName + ": " + ErrorDescription)

 

        Dts.TaskResult = Dts.Results.Success

    End Sub

End Class

앞에서 추가한 SourceName, PackageName, ErrorDescription 변수들은 시스템 변수들로서 우리에게
어느 패키지, 어디에서, 어떤 에러가 났다는 것을 알려줄 고마운 친구들입니다.
마구마구 사용합니다;;;


제어 흐름에서 추가한 SQL 실행 작업은 단일 행을 설정하고 변수와 매핑을 시켰기 때문에 값이 들어
와야 하지만 쿼리 상으로 아무 값도 넘어오지 않기 때문에 에러가 발생합니다.

에러를 기록하기 위해서 이벤트 처리기의 OnError 이벤트에 어떤 작업을 설정해놔서 에러가 발생하면
이벤트 로그에 남기도록 구성을 것입니다.

이벤트 처리기로 처리했으니 다른 에러 처리도 추가해보겠습니다.

 

11.    제어 흐름 디자인 창으로 돌아와서 데이터 흐름 작업 추가하고 SQL 실행 작업과 연결합니다.
위의 SQL 실행 작업은 에러가 발생할 이므로 연결 선을 더블 클릭해서 선행 제약 조건 편집기 창을
띄웁니다. 거기서 값을 성공에서 완료로 변경합니다.

 

12.    데이터 흐름 작업을 더블 클릭해서 데이터 흐름 디자인 창으로 들어옵니다.
OLE DB
원본 추가하고 연결 관리자는 아까 생성한 DB 설정합니다.
데이터 액세스 모드는 SQL 명령으로 변경합니다.
SQL
명령 텍스트 입력 창에 아래의 쿼리를 입력합니다.

select '1' AS InputCol union all

select '2' AS InputCol union all

select '3' AS InputCol union all

select 'aaa' AS InputCol union all

select '0' AS InputCol union all

select '4' AS InputCol union all

select '5'


강좌를 성실히 읽어 분이라면 위의 쿼리를 제가 어디서 가져왔는지 아실 텐데… ^^;;;.
스크립트 변환에서 오류 처리하기 강좌에서 사용된 쿼리입니다.

13.    스크립트 구성 요소 추가합니다.
입력 메뉴에서 InputCol 선택해주시구요.
/출력 메뉴에서 출력0 > 출력 열을 선택하시고 추가를 하겠습니다.
이름은 OutputCol 좋겠네요.
데이터 타입은 부호 없는 4바이트 정수 [DT_I4] 설정합니다.
출력0 선택하시고 우측 공용 속성 ExclusionGroup 0 아닌 다른
(
여기서는 1)으로 변경합니다.
스크립트 메뉴를 선택하시고 스크립트 디자인을 클릭하셔서 VS for App 창을 엽니다.

여기까지의 인증 ~!

 

왠지 인증 샷이 사람을 혼란하게 만드는 같습니다. 하지만 컷씩 캡쳐 했더니 나중에 이미지가 너무 많아져서;;;
이해 해주세용~ ^^;;

 

14.    VS for App 아래의 소스를 입력합니다.

Imports System

Imports System.Data

Imports System.Math

Imports Microsoft.SqlServer.Dts.Pipeline.Wrapper

Imports Microsoft.SqlServer.Dts.Runtime.Wrapper

Imports System.Diagnostics

 

Public Class ScriptMain

    Inherits UserComponent

 

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

        Dim i As Integer

 

        Try

            i = CInt(10 / CInt(Row.InputCol))

            Row.OutputCol = i

            Row.DirectRowTo출력0()

        Catch ex As Exception

            Dim PackageName As String = "P_ADEventLog"

            Dim TaskName As String = "스크립트 구성 요소"

 

            If Not EventLog.SourceExists(PackageName) Then

                EventLog.CreateEventSource(PackageName, "SSIS Log")

            End If

 

            EventLog.WriteEntry(PackageName, _

                "Where: " + TaskName + System.Environment.NewLine + "Error Message: " + ex.Message)

        End Try

    End Sub

 

End Class

 

여기서는 Try ~ Catch 문으로 에러를 처리하려고 합니다. 자세한 설명은 한대성 님의 스크립트 변환에서
오류 처리하기 강좌를 한번 읽어주세요. ^^;;;

 

15.    데이터 흐름 디자인 창으로 나와서 멀티 캐스트 같은 작업을 하나 추가하고 스크립트 구성 요소와 연결해줍니다.
~ 이제 준비가 됐으니 실행을 해볼까요?

 

16.    디버깅을 해봅니다.
저의 경우에는 다음과 같은 결과가 출력되었습니다.



이벤트 로그로 달려가봅니다.
어떤 로그가 남겨졌을까요


메일도 아닌 것이 3통이 와있습니다.



위에서 말했다시피 SQL 실행 작업에서 단일 결과 집합이 반환되지 않아서 오류가 발생했고,
스크립트 구성 요소에서 변환 실패와 0으로 나누려는 때문에 오류가 2차례 발생하였습니다.

 

이벤트 처리기에 등록하거나 Try ~ Catch 문을 이용하면 오류를 로그로 남기는 것이 가능하리라 생각됩니다.

아무리 생각해도 스크립트 작업은 SSIS에게 날개를 달아준 같습니다. ^^;;; MS 인듯
반응형

+ Recent posts