원격 컴퓨터에서 프로그래밍 방식으로 SSIS 패키지 실행

클라이언트(로컬) 컴퓨터에 Integration Services가 설치되지 않았거나 패키지에 필요한 모든 리소스에 대한 액세스 권한이 없는 경우 패키지가 저장된 원격 컴퓨터에서 패키지가 실행되도록 패키지를 시작해야 합니다. 패키지를 시작하는 응용 프로그램과 동일한 컴퓨터에서 패키지가 실행되므로 원격 컴퓨터에서 패키지가 실행되게 하려면 추가 단계를 수행해야 합니다. 따라서 로컬 컴퓨터의 응용 프로그램에서 원격 패키지를 직접 실행하는 경우 패키지가 로컬 컴퓨터에서 로드되어 실행됩니다. 로컬 컴퓨터에 Integration Services가 설치되지 않았거나 패키지에 필요한 모든 리소스에 대한 액세스 권한이 없는 경우 패키지가 올바르게 실행되지 않습니다.

[!참고]

SQL Server 사용 조건에서 추가 컴퓨터에 Integration Services를 설치하는 것을 허용하지 않을 수도 있으므로 클라이언트 컴퓨터에 Integration Services가 설치되지 않았을 수도 있습니다. Integration Services는 서버 구성 요소이며 클라이언트 컴퓨터에 재배포할 수 없습니다. 그러나 Integration Services가 설치되어 있고 패키지에 필요한 모든 리소스에 대한 액세스 권한이 있는 로컬 컴퓨터를 사용하여 원격 패키지를 실행할 수 있습니다. 자세한 내용은 로컬 컴퓨터에서 프로그래밍 방식으로 SSIS 패키지 실행을 참조하십시오.

원격 컴퓨터에서 패키지를 시작하려면 다음 프로그램 중 하나를 호출합니다.

  • SQL Server 에이전트

  • 원격 컴퓨터에서 실행 중인 다른 응용 프로그램, 구성 요소 또는 웹 서비스

이 항목의 섹션

  • 원격 컴퓨터의 사전 요구 사항

  • SQL Server 에이전트를 호출하여 원격으로 패키지 실행

  • 원격 구성 요소 또는 서비스를 호출하여 원격으로 패키지 실행

원격 컴퓨터의 사전 요구 사항

원격 컴퓨터에서 패키지를 실행하는 프로세스에 필요한 권한이 있는지 확인해야 합니다. 이 프로세스에는 패키지를 시작할 수 있는 권한뿐만 아니라 패키지에 사용되는 모든 리소스를 찾아 열 수 있는 권한도 필요합니다. 대체로 기본 사용 권한만으로 부족하며, 특히 웹 기반 솔루션에서는 더욱 그렇습니다. 사용 권한, 인증 및 권한 부여에 대한 자세한 설명은 이 항목에서 다루지 않습니다.

흔히 패키지를 실행하기 위해 다른 계정을 가장하는 것은 바람직한 해결 방법이 아닙니다. 가장된 계정으로 패키지가 시작되더라도 패키지에서 만들어지는 추가 스레드는 패키지를 시작한 프로세스에 사용되는 계정으로 되돌려집니다. 이러한 스레드에는 데이터 흐름에서 데이터를 로드하고 저장하는 데 사용되는 스레드가 포함됩니다. 따라서 프로세스 계정 자체에 패키지에 사용되는 대부분의 외부 리소스에 대한 사용 권한이 필요합니다.

SQL Server 에이전트를 호출하여 원격으로 SSIS 패키지 실행

다음 예제 코드는 SQL Server 에이전트를 프로그래밍 방식으로 호출하여 원격 컴퓨터에서 패키지를 실행하는 방법을 보여 줍니다. 이 예제 코드에서는 sp_start_job이라는 시스템 저장 프로시저를 호출하는데, 이 프로시저는 원격 컴퓨터에 있는 RunSSISPackage라는 SQL Server 에이전트 작업을 시작합니다. 그러면 RunSSISPackage 작업이 실행되고 있는 원격 컴퓨터에서 패키지가 실행됩니다.

[!참고]

sp_start_job 저장 프로시저의 반환 값은 저장 프로시저에서 SQL Server 에이전트 작업을 성공적으로 시작할 수 있었는지 여부를 나타내며, 패키지가 성공했는지 실패했는지를 나타내지는 않습니다.

SQL Server 에이전트 작업에서 실행되는 패키지의 문제를 해결하는 방법은 Microsoft 문서 SQL Server 에이전트 작업 단계에서 SSIS 패키지를 호출할 때 SSIS 패키지가 실행되지 않는다를 참조하십시오.

예제 코드

다음 코드 예제에는 System.Data 어셈블리에 대한 참조가 필요합니다.

Imports System.Data
Imports System.Data.SqlClient

Module Module1

  Sub Main()

    Dim jobConnection As SqlConnection
    Dim jobCommand As SqlCommand
    Dim jobReturnValue As SqlParameter
    Dim jobParameter As SqlParameter
    Dim jobResult As Integer

    jobConnection = New SqlConnection("Data Source=(local);Initial Catalog=msdb;Integrated Security=SSPI")
    jobCommand = New SqlCommand("sp_start_job", jobConnection)
    jobCommand.CommandType = CommandType.StoredProcedure

    jobReturnValue = New SqlParameter("@RETURN_VALUE", SqlDbType.Int)
    jobReturnValue.Direction = ParameterDirection.ReturnValue
    jobCommand.Parameters.Add(jobReturnValue)

    jobParameter = New SqlParameter("@job_name", SqlDbType.VarChar)
    jobParameter.Direction = ParameterDirection.Input
    jobCommand.Parameters.Add(jobParameter)
    jobParameter.Value = "RunSSISPackage"

    jobConnection.Open()
    jobCommand.ExecuteNonQuery()
    jobResult = DirectCast(jobCommand.Parameters("@RETURN_VALUE").Value, Integer)
    jobConnection.Close()

    Select Case jobResult
      Case 0
        Console.WriteLine("SQL Server Agent job, RunSISSPackage, started successfully.")
      Case Else
        Console.WriteLine("SQL Server Agent job, RunSISSPackage, failed to start.")
    End Select
    Console.Read()

  End Sub

End Module
using System;
using System.Data;
using System.Data.SqlClient;

namespace LaunchSSISPackageAgent_CS
{
  class Program
  {
    static void Main(string[] args)
    {
      SqlConnection jobConnection;
      SqlCommand jobCommand;
      SqlParameter jobReturnValue;
      SqlParameter jobParameter;
      int jobResult;

      jobConnection = new SqlConnection("Data Source=(local);Initial Catalog=msdb;Integrated Security=SSPI");
      jobCommand = new SqlCommand("sp_start_job", jobConnection);
      jobCommand.CommandType = CommandType.StoredProcedure;

      jobReturnValue = new SqlParameter("@RETURN_VALUE", SqlDbType.Int);
      jobReturnValue.Direction = ParameterDirection.ReturnValue;
      jobCommand.Parameters.Add(jobReturnValue);

      jobParameter = new SqlParameter("@job_name", SqlDbType.VarChar);
      jobParameter.Direction = ParameterDirection.Input;
      jobCommand.Parameters.Add(jobParameter);
      jobParameter.Value = "RunSSISPackage";

      jobConnection.Open();
      jobCommand.ExecuteNonQuery();
      jobResult = (Int32)jobCommand.Parameters["@RETURN_VALUE"].Value;
      jobConnection.Close();

      switch (jobResult)
      {
        case 0:
          Console.WriteLine("SQL Server Agent job, RunSISSPackage, started successfully.");
          break;
        default:
          Console.WriteLine("SQL Server Agent job, RunSISSPackage, failed to start.");
          break;
      }
      Console.Read();
    }
  }
}

맨 위로 이동

원격 구성 요소 또는 서비스를 호출하여 원격으로 SSIS 패키지 실행

이전 섹션에서 설명한 원격 컴퓨터에서 프로그래밍 방식으로 패키지를 실행하는 경우 원격 컴퓨터에 사용자 지정 코드가 필요하지 않습니다. 그러나 SQL Server 에이전트를 사용하지 않고 패키지를 실행하려는 경우가 있습니다.

다음 예는 원격 컴퓨터에서 Integration Services 패키지를 시작하기 위해 원격 구성 요소 또는 서버의 웹 서비스에서 사용할 수 있는 부분 코드를 제공합니다.

예제 코드

다음 코드 예제는 패키지를 원격으로 실행하는 원격 클래스를 만들고 테스트하는 방법을 제안합니다. 이러한 예제는 완전하지는 않지만 원격 구성 요소 또는 웹 서비스로 작성된 솔루션의 일부로 사용할 수 있는 코드를 제공합니다.

이 예제에는 Microsoft.SqlServer.ManagedDTS 어셈블리에 대한 참조가 필요합니다.

SSIS 패키지를 원격으로 실행할 함수 만들기

Integration Services 패키지를 파일 또는 SQL Server에서 직접 로드하거나, SQL Server와 특수 파일 시스템 폴더의 패키지 저장소를 관리하는 SSIS 패키지 저장소에서 로드할 수 있습니다. 사용할 수 있는 모든 로드 옵션을 지원하기 위해 이 예제에서는 Select Case 또는 switch 구문을 사용하여 패키지를 시작하기 위한 적당한 구문을 선택하고 입력 인수를 적절히 연결합니다.

중요 정보중요

SSIS 패키지 저장소를 사용하기 위한 Application 클래스의 메서드는 ".", localhost 또는 로컬 서버의 서버 이름만 지원합니다. "(local)"은 사용할 수 없습니다.

LaunchPackage 메서드는 클라이언트 컴퓨터에서 Integration Services 어셈블리에 대한 참조가 필요하지 않도록 패키지 실행 결과를 DTSExecResult 값 대신 정수로 반환합니다.

중요 정보중요

이 예제는 완전하지는 않지만 원격 구성 요소나 웹 서비스로 작성된 솔루션의 일부로 사용할 수 있는 코드를 제공합니다. 이 예제에는 원격 구성 요소 또는 서비스를 작성하고 표시하는 데 필요할 수 있는 코드, 특성 또는 참조가 포함되어 있지 않습니다.

원격 클래스를 만들어 서버에서 프로그래밍 방식으로 패키지를 실행하려면

  1. Visual Studio를 열고 선호하는 프로그래밍 언어로 적절한 유형의 프로젝트를 만듭니다.

    다음 예제 코드에서는 프로젝트 이름으로 LaunchSSISPackageService를 사용합니다.

  2. Microsoft.SqlServer.ManagedDTS 어셈블리에 대한 참조를 추가합니다.

  3. 예제 코드를 클래스 파일에 붙여 넣습니다.

    이 예제에서는 코드 창의 전체 내용을 보여 줍니다.

  4. 원격 구성 요소 또는 서비스를 작성하고 표시하는 데 필요할 수 있는 코드, 특성 또는 참조를 추가합니다.

  5. 이 예제 코드를 포함하는 프로젝트를 빌드하고 테스트합니다.

Imports Microsoft.SqlServer.Dts.Runtime
Imports System.IO

Public Class LaunchSSISPackageService

  ' LaunchPackage Method Parameters:
  ' 1. sourceType: file, sql, dts
  ' 2. sourceLocation: file system folder, (none), logical folder
  ' 3. packageName: for file system, ".dtsx" extension is appended

  Public Function LaunchPackage( _
    ByVal sourceType As String, _
    ByVal sourceLocation As String, _
    ByVal packageName As String) 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

    Return myPackage.Execute()

  End Function

End Class
using Microsoft.SqlServer.Dts.Runtime;
using System.IO;

public class LaunchSSISPackageServiceCS
{
  public LaunchSSISPackageServiceCS()
  {
    }

  // LaunchPackage Method Parameters:
  // 1. sourceType: file, sql, dts
  // 2. sourceLocation: file system folder, (none), logical folder
  // 3. packageName: for file system, ".dtsx" extension is appended

  public int LaunchPackage(string sourceType, string sourceLocation, string packageName)
  { 

    string packagePath;
    Package myPackage;
    Application integrationServices = new Application();

    // Combine path and file name.
    packagePath = Path.Combine(sourceLocation, packageName);

    switch(sourceType)
    {
      case "file":
        // Package is stored as a file.
        // Add extension if not present.
        if (String.IsNullOrEmpty(Path.GetExtension(packagePath)))
        {
          packagePath = String.Concat(packagePath, ".dtsx");
        }
        if (File.Exists(packagePath))
        {
          myPackage = integrationServices.LoadPackage(packagePath, null);
        }
        else
        {
          throw new ApplicationException("Invalid file location: "+packagePath);
        }
        break;
      case "sql":
        // Package is stored in MSDB.
        // Combine logical path and package name.
        if (integrationServices.ExistsOnSqlServer(packagePath, ".", String.Empty, String.Empty))
        {
          myPackage = integrationServices.LoadFromSqlServer(packageName, "(local)", String.Empty, String.Empty, null);
        }
        else
        {
          throw new ApplicationException("Invalid package name or location: "+packagePath);
        }
        break;
      case "dts":
        // Package is managed by SSIS Package Store.
        // Default logical paths are File System and MSDB.
        if (integrationServices.ExistsOnDtsServer(packagePath, "."))
        {
          myPackage = integrationServices.LoadFromDtsServer(packagePath, "localhost", null);
        }
        else
        {
          throw new ApplicationException("Invalid package name or location: "+packagePath);
        }
        break;
      default:
        throw new ApplicationException("Invalid sourceType argument: valid values are 'file', 'sql', and 'dts'.");
    }

    return (Int32)myPackage.Execute();

  }

}

SSIS 패키지를 원격으로 실행할 함수 호출

다음 예제 콘솔 응용 프로그램에서는 원격 구성 요소 또는 서비스를 사용하여 패키지를 실행합니다.

원격 클래스의 LaunchPackage 메서드는 Integration Services 어셈블리에 대한 참조가 클라이언트 컴퓨터에 필요하지 않도록 패키지 실행 결과를 DTSExecResult 값 대신 정수로 반환합니다. 이 예제에서는 DTSExecResult 값을 미러링하는 값을 포함하는 전용 열거형을 만들어 실행 결과를 보고합니다.

콘솔 응용 프로그램을 만들어 원격 클래스를 테스트하려면

  1. Visual Studio에서 선호하는 프로그래밍 언어를 사용하여 새 콘솔 응용 프로그램을 만듭니다.

    이 예제 코드에서는 프로젝트 이름으로 LaunchSSISPackageTest를 사용합니다.

  2. 원격 구성 요소 또는 서비스를 나타내는 로컬 프록시 어셈블리에 대한 참조를 추가합니다. 필요할 경우 예제 코드에서 프록시 개체에 지정한 이름에 대한 변수 선언을 조정합니다.

  3. 코드에 기본 루틴 및 전용 열거형에 대한 예제 코드를 붙여 넣습니다.

    이 예제에서는 코드 창의 전체 내용을 보여 줍니다.

  4. LaunchPackage 메서드를 호출하는 코드 줄을 편집하여 기존 패키지를 가리키는 입력 인수에 대한 올바른 값 집합을 제공합니다.

    예를 들어 package1.dtsx가 서버의 C:\My Packages에 저장되어 있는 경우 sourceType 값으로 "file"을 전달하고, sourceLocation 값으로 "C:\My Packages"를 전달하고, packageName 값으로 "package1"(확장명 없음)을 전달합니다.

Module LaunchSSISPackageTest

  Sub Main()

    Dim launchPackageService As New LaunchSSISPackageService.LaunchSSISPackageService
    Dim packageResult As Integer

    Try
      packageResult = launchPackageService.LaunchPackage("sql", String.Empty, "SimpleTestPackage")
    Catch ex As Exception
      Console.WriteLine("The following exception occurred: " & ex.Message)
    End Try

    Console.WriteLine(CType(packageResult, PackageExecutionResult).ToString)
    Console.ReadKey()

  End Sub

  Private Enum PackageExecutionResult
    PackageSucceeded
    PackageFailed
    PackageCompleted
    PackageWasCancelled
  End Enum

End Module
using System;

namespace LaunchSSISPackageSvcTestCS
{
  class Program
  {
    static void Main(string[] args)
    {
      LaunchSSISPackageServiceCS.LaunchSSISPackageServiceCS launchPackageService = new LaunchSSISPackageServiceCS.LaunchSSISPackageServiceCS();
      int packageResult = 0;

      try
      {
        packageResult = launchPackageService.LaunchPackage("sql", String.Empty, "SimpleTestPackage");
      }
      catch (Exception ex)
      {
        Console.WriteLine("The following exception occurred: " + ex.Message);
      }

      Console.WriteLine(((PackageExecutionResult)packageResult).ToString());
      Console.ReadKey();

    }

    private enum PackageExecutionResult
    {
      PackageSucceeded,
      PackageFailed,
      PackageCompleted,
      PackageWasCancelled
    };

  }
}

맨 위로 이동

외부 리소스

Integration Services 아이콘(작은 아이콘) Integration Services 관련 최신 정보 얻기

Microsoft의 최신 다운로드, 기술 자료, 예제 및 비디오와 커뮤니티에서 선택된 솔루션을 보려면 MSDN의 Integration Services 페이지를 방문하십시오.


이러한 업데이트에 대한 자동 알림을 받으려면 해당 페이지에서 제공하는 RSS 피드를 구독하십시오.