반응형

원격에서 패키지 호출하기 - (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



이와
같은 방식을 응용해서 서비스뿐만 아니라 패키지를 호출하는 응용 프로그램을 만들 수도 있습니다.






이로서
원격에서 패키지를 호출하는 방식에 대해 간략히 살펴봤습니다. 매번 강좌 글을 때마다 느끼는 생각이지만, 머리 속에 있는 내용을 글로 끄집어 낸다는 것은 정말 어렵고 힘든 노가다 작업인 같습니다. 연휴 전에 마치리라는 생각으로 두서없이 시작했는데 업무 때문에 이리 저리 급하게 쓰다 보니 강좌 또한 아쉬움이 남는 형태로 마치게 되네요.

강좌 주제가 전혀 필요하지 않아서 도움이 안될 수도 있겠지만, 간간히 설명한 가지 방식을 이용하면 여러 형태로 응용하실 있을 것입니다.

그리고 부탁 드리겠습니다. 여기에 소개한 몇몇 방법들 외에도 운영하시면서 좋은 방법이 있거나 다른 생각이 있으신 , 설명한 방식을 이용할 때의 문제점들이 있으시면 댓글이나 질문, 메일 어떤 방법으로든지 공유해 주시기 바랍니다.

반응형

+ Recent posts