제 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 ' ' 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 ' ' 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에 대한 속성식이 설정된 것을 확인할 수 있습니다. 이 외에도 필요에 따라 다양한 속성값들에 대해 속성식을 정의할 수 있습니다.
이제 어느 정도 조금씩 패키지 형태를 갖추어 가는 듯 합니다. 귀찮더라도 한 번 직접 패키지를 구성해 보시기 바랍니다.^^
'연구개발 > DTS & SSIS' 카테고리의 다른 글
실습 강좌 5 - 복수 대상으로 적재하기 (0) | 2009.06.20 |
---|---|
실습 강좌 4 - 데이터 필터링 구현 (0) | 2009.06.20 |
실습 강좌 2 - 테이블 생성 작업 추가 (0) | 2009.06.20 |
실습 강좌 1 - 텍스트 데이터 파일을 테이블로 로딩하기 (0) | 2009.06.20 |
실습 강좌 0 - 강좌 소개 - 텍스트 파일 로딩 (0) | 2009.06.20 |