원격에서 패키지 호출하기 - (5) 웹 서비스를 이용한 호출
한대성
MS SQL Server MVP
에이디컨설팅 책임 컨설턴트 | SQLLeader.com 운영자
<강좌 구성>
1. 구현 환경 설명 2. 테스트 용 패키지 만들기 3. SQL Agent Job을 이용한 호출 4. xp_cmdshell 명령을 이용한 호출 5. 웹 서비스를 이용한 호출 |
5. 웹 서비스를 이용한 호출
마지막으로 웹 서비스를 이용하여 원격에서 패키지를 호출하는 방법에 대해 알아보겠습니다.
SSIS 패키지를 실행시키기 위해서는 반드시 SQL Server가 있어야 할 필요는 없습니다.
(그렇다고 SQL Server 라이선스 없이 SSIS 패키지를 사용할 수 있는 것은 아닙니다.^^)
만약, 패키지가 있는 서버에 SQL Server가 없는 경우에는 위의 그림과 같이 웹 서비스를 이용해서 패키지를 실행할 수 있습니다.
이 경우에는 dtexec.exe를 이용해서 패키지를 실행시키는 것이 아니라 패키지 개체를 생성한 후, 이를 실행하는 방식을 이용합니다.
Visual Studios에서 새로운 웹 사이트를 하나 만듭니다.
ASP.NET 웹 서비스를 선택하고 언어는 Visual Basic으로 선택합니다.
웹 사이트(S) 메뉴에서 참조 추가(R)을 선택한 후, 다음과 같이 두 개의 구성 요소를 추가합니다.
Microsoft.SqlServer.Dts.Design
Microsoft.SqlServer.ManagedDTS
이제 Service.vb 파일에 다음과 같은 소스를 입력합니다.
참고로, 본 소스는 MSDN에 있는 소스이며, 본 강좌에서는 InputVal 변수에 값을 넘겨주고 결과로 OutputVal 값을 받아서 리턴 해 주는 방식으로 약간 수정하였습니다.
Imports System.Web Imports System.Web.Services Imports System.Web.Services.Protocols Imports Microsoft.SqlServer.Dts.Runtime Imports System.IO <WebService(Namespace:="http://dtsue/")> _ <WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _ <Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _ Public Class LaunchSSISPackageService Inherits System.Web.Services.WebService <WebMethod()> _ Public Function LaunchPackage( _ ByVal sourceType As String, _ ByVal sourceLocation As String, _ ByVal packageName As String, _ ByVal InputVal As Integer) As Integer 'DTSExecResult Dim packagePath As String Dim myPackage As Package Dim integrationServices As New Application ' Combine path and file name. packagePath = Path.Combine(sourceLocation, packageName) Select Case sourceType Case "file" ' Package is stored as a file. ' Add extension if not present. If String.IsNullOrEmpty(Path.GetExtension(packagePath)) Then packagePath = String.Concat(packagePath, ".dtsx") End If If File.Exists(packagePath) Then myPackage = integrationServices.LoadPackage(packagePath, Nothing) Else Throw New ApplicationException( _ "Invalid file location: " & packagePath) End If Case "sql" ' Package is stored in MSDB. ' Combine logical path and package name. If integrationServices.ExistsOnSqlServer(packagePath, ".", String.Empty, String.Empty) Then myPackage = integrationServices.LoadFromSqlServer( _ packageName, "(local)", String.Empty, String.Empty, Nothing) Else Throw New ApplicationException( _ "Invalid package name or location: " & packagePath) End If Case "dts" ' Package is managed by SSIS Package Store. ' Default logical paths are File System and MSDB. If integrationServices.ExistsOnDtsServer(packagePath, ".") Then myPackage = integrationServices.LoadFromDtsServer(packagePath, "localhost", Nothing) Else Throw New ApplicationException( _ "Invalid package name or location: " & packagePath) End If Case Else Throw New ApplicationException( _ "Invalid sourceType argument: valid values are 'file', 'sql', and 'dts'.") End Select Dim OutputVal As Integer myPackage.Variables("InputVal").Value = InputVal myPackage.Execute() OutputVal = myPackage.Variables("OutputVal").Value Return OutputVal End Function End Class |
위와 같이 입력한 다음, 솔루션 탐색기에서 Services.asmx를 연 다음 Class 부분을 다음과 같이 변경합니다.
<%@ WebService Language="vb" CodeBehind="~/App_Code/Service.vb" Class="LaunchSSISPackageService" %> |
자, 이제 바로 디버깅을 하거나 서버에 배포한 후, 실행시켜 봅시다.
LaunchPackage를 선택한 후, 다음과 같이 패키지 유형 및 이름, 입력 값(InputVal)을 입력합니다.
호출을 클릭하면 다음과 같이 결과값을 출력합니다.
웹 서비스가 잘 실행되는 것을 확인한 후, 실제로 값을 넘겨주고 받는 것을 구현해 보겠습니다. 이 테스트 또한 SSIS 패키지의 웹 서비스 작업을 이용하겠습니다.
본 강좌에서는 테스트를 위해 웹 서비스 파일을 웹 서버에 배포하였습니다. (ASP.NET 버전 : 2.0.50727)
새로운 SSIS 패키지 파일을 연 다음, 아래와 같이 두 개의 변수를 추가합니다. InputVal 변수는 Int32 형이며, OutputVal 변수는 String 형으로 설정합니다.
제어 흐름 영역에 웹 서비스 작업을 추가한 후, 속성 창의 HttpConnection 부분에서 새 연결을 선택해서 웹 서비스 연결을 설정합니다.
이 때, 서버 URL(U) 부분에는 아래와 같이
http://서버 주소/service.asmx?wsdl
형식으로 입력합니다.
예) http://test.sqlleader.com/ssis/service.asmx?wsdl
연결 테스트가 성공적으로 되면 확인을 눌러 연결 관리자 편집기를 닫고, 다음과 같이 WSDLFile 부분에 웹 서비스에서 필요한 WSDL 파일의 경로를 임의로 입력합니다.
WSDL 파일이 없는 경우, 아래에 있는 WSDL 다운로드(D) 버튼을 클릭하면 자동으로 생성됩니다.
(참고, 파일 경로를 입력한 후, 다른 속성으로 이동하면 아래의 버튼이 활성화 됩니다.)
입력 탭으로 이동한 후, 다음과 같이 속성들을 입력합니다. 이 때, 패키지의 위치는 서버의 패키지 위치입니다. 즉, sourceLocation의 D:\ 는 실제 서버의 D:\ 디렉터리를 말합니다.
InputVal의 값은 직접 입력해도 되지만, 패키지에서 추가한 변수(InputVal)의 값을 입력하도록 합시다. 오른쪽에 있는 변수 부분의 체크 박스를 체크한 후, 값 부분에서 전달할 변수를 선택합니다.
비슷한 방식으로 출력 탭에서 출력 결과를 저장할 변수를 선택합니다.
자, 이제 웹 서비스 작업 편집기를 닫은 후, 결과를 확인하기 위해 스크립트 작업을 웹 서비스 작업에 연결하고 스크립트 작업 편집기에서 ReadOnly 속성에 OutputVal 변수를 입력합니다.
스크립트 디자인(S) 버튼을 클릭해서 VSA를 연 후, 다음과 같은 간단한 스크립트를 입력합니다.
Imports System Imports System.Data Imports System.Math Imports Microsoft.SqlServer.Dts.Runtime Public Class ScriptMain Public Sub Main() MsgBox(Dts.Variables("OutputVal").Value) Dts.TaskResult = Dts.Results.Success End Sub End Class |
자, 웹 서비스 호출을 위한 테스트 패키지가 만들어졌습니다..
한 번 테스트 해 봅시다.
InputVal 값이 45인 경우
InputVal 값이 12인 경우
XML 형태로 결과가 출력되며 XML 작업을 이용해서 필요한 부분을 추출해서 사용하면 됩니다.
이에 대한 방법은 다음 강좌 글을 참고하시기 바랍니다.
http://www.sqlleader.com/mboard.asp?exec=view&strBoardID=SS2005SSIS&intSeq=1542
이와 같은 방식을 응용해서 웹 서비스뿐만 아니라 패키지를 호출하는 응용 프로그램을 만들 수도 있습니다.
이로서 원격에서 패키지를 호출하는 방식에 대해 간략히 살펴봤습니다. 매번 강좌 글을 쓸 때마다 느끼는 생각이지만, 머리 속에 있는 내용을 글로 끄집어 낸다는 것은 정말 어렵고 힘든 노가다 작업인 것 같습니다. 연휴 전에 마치리라는 생각으로 두서없이 시작했는데 업무 때문에 이리 저리 급하게 쓰다 보니 본 강좌 또한 아쉬움이 남는 형태로 마치게 되네요.
본 강좌 주제가 전혀 필요하지 않아서 도움이 안될 수도 있겠지만, 간간히 설명한 몇 가지 방식을 이용하면 여러 형태로 응용하실 수 있을 것입니다.
그리고 부탁 드리겠습니다. 여기에 소개한 몇몇 방법들 외에도 운영하시면서 더 좋은 방법이 있거나 다른 생각이 있으신 분, 설명한 방식을 이용할 때의 문제점들이 있으시면 댓글이나 질문, 메일 등 어떤 방법으로든지 공유해 주시기 바랍니다.
'연구개발 > DTS & SSIS' 카테고리의 다른 글
RetainSameConnection 옵션 (0) | 2009.06.20 |
---|---|
Object 형 변수를 이용한 루핑 작업 구현 (0) | 2009.06.20 |
원격에서 패키지 호출하기 – (4) xp_cmdshell 명령을 이용한 호출 (0) | 2009.06.20 |
원격에서 패키지 호출하기 – (3) SQL Agent Job을 이용한 호출 (0) | 2009.06.20 |
원격에서 패키지 호출하기 – (2) 테스트용 패키지 만들기 (0) | 2009.06.20 |