Поделиться через


Программный запуск пакета служб SSIS на удаленном компьютере

Если на клиентском (локальном) компьютере нет установленных служб Integration Services или нет доступа ко всем необходимым пакету ресурсам, необходимо запустить пакет на удаленном компьютере, где он хранится. Необходимо выполнить дополнительные шаги и убедиться, что пакет запущен на удаленном компьютере, поскольку пакет запускается на том же компьютере, что и приложение, запускающее пакет. Если запустить удаленный пакет непосредственно из приложения на локальном компьютере, пакет будет загружен на локальный компьютер и будет запущен оттуда. Поскольку на локальном компьютере не установлены службы Integration Services или нет доступа ко всем необходимым пакету ресурсам, не удастся успешно запустить пакет.

ПримечаниеПримечание

На клиентском компьютере могут быть не установлены службы Integration Services, поскольку условия лицензионного соглашения SQL Server не позволяют устанавливать Integration Services на дополнительные компьютеры. (Службы Integration Services являются серверным компонентом и не распространяются на клиентских компьютерах.) Однако если на локальном компьютере установлены службы Integration Services и есть доступ ко всем необходимым пакету ресурсам, можно использовать локальный компьютер для запуска удаленного пакета. Дополнительные сведения см. в разделе Программный запуск пакета служб SSIS на локальном компьютере.

Чтобы запустить пакет на удаленном компьютере, вызовите одну из следующих программ.

  • Агент SQL Server.

  • Другое приложение, компонент или веб-службу, запущенные на удаленном компьютере.

Подразделы данного раздела

  • Предварительные условия для удаленного компьютера

  • Запуск пакета удаленно с помощью вызова агента SQL Server

  • Запуск пакета удаленно с помощью вызова удаленного компонента или службы

Предварительные условия для удаленного компьютера

Необходимо убедиться, что у процесса, запускающего пакет на удаленном компьютере, есть все необходимые разрешения. Процессу необходимы разрешения не только на запуск пакета, но и на поиск и открытие всех используемых пакетом ресурсов. Разрешений по умолчанию часто бывает недостаточно, особенно в сетевых решениях. Подробное обсуждение разрешений на доступ, проверки подлинности и авторизации выходит за рамки этого раздела.

Олицетворение другой учетной записи для запуска пакета часто не является удачным решением. Хотя пакет запускается под олицетворенной учетной записью, дополнительные потоки, создаваемые пакетом, запускают именно той учетной записью, которая начала процесс запуска пакета. Эти потоки включают в себя потоки, используемые потоками данных для загрузки и хранения данных. Таким образом, учетной записи процесса нужны разрешения для большинства внешних ресурсов, используемых пакетом.

Удаленный запуск пакета служб SSIS с помощью вызова агента SQL Server

В следующем образце кода демонстрируется, как программным способом вызвать агент SQL Server для запуска пакета на удаленном компьютере. В образце кода вызывается системная хранимая процедура sp_start_job, которая запускает задание агента SQL Server с именем RunSSISPackage на удаленном компьютере. Затем задание RunSSISPackage запускает пакет на удаленном компьютере, где запущено само задание.

ПримечаниеПримечание

Значение, возвращаемое хранимой процедурой sp_start_job, указывает, удалось ли хранимой процедуре успешно запустить задание агента SQL Server. Значение возврата не указывает на успешное или неуспешное выполнение пакета.

Сведения об устранении неполадок в пакетах, запускаемых из агента заданий SQL Server, см. в статье базы знаний MicrosoftПакет служб SSIS не выполняется при вызове пакета из шага задания агента SQL Server.

Образец кода

Для следующих образцов кода нужна ссылка на сборку 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 или из хранилища пакетов служб SSIS, которое управляет хранением пакетов в SQL Server и специальных папках файловой системы. Для поддержки всех доступных параметров загрузки этот образец использует конструкции Select Case или switch, чтобы выбрать подходящий синтаксис для запуска пакета и соответствующего объединения его входных аргументов.

Важное примечаниеВажно!

Методы класса Application для работы с хранилищем пакетов служб SSIS поддерживают только имена «.», localhost и имя сервера для локального сервера. Нельзя использовать имя «(local)».

Метод LaunchPackage возвращает результат выполнения пакета как целое число вместо значения DTSExecResult, чтобы для клиентских компьютеров не требовалась ссылка на какие-либо сборки служб Integration Services.

Важное примечаниеВажно!

Этот образец не является завершенным, но предоставляет код, который может использоваться как часть решения, построенного в виде удаленного компонента или веб-службы. Образец не содержит код, атрибуты или ссылки, которые могут потребоваться для построения или обеспечения доступа к удаленным компонентам или службам.

Создание удаленного класса для запуска пакетов на сервере программным способом

  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 удаленного класса возвращает результат выполнения пакета как целое число вместо значения DTSExecResult, чтобы для клиентских компьютеров не требовалась ссылка на какие-либо сборки служб Integration Services. В образце создается закрытое перечисление, значения которого отражают значения DTSExecResult, составляя отчет о результатах выполнения.

Создание консольного приложения для проверки удаленного класса

  1. В Visual Studio создайте новое консольное приложение на предпочитаемом языке программирования.

    В образце кода для проекта используется имя LaunchSSISPackageTest для проекта.

  2. Добавьте ссылку на локальную сборку прокси, представляющую удаленные компоненты или службы. При необходимости измените декларацию переменной в образце кода на имя, назначенное для объекта учетной записи-посредника.

  3. Вставьте образец кода для подпрограммы Main и закрытого перечисления в код.

    В этом образце приводится полное содержимое окна кода.

  4. Измените строку кода, которой вызывается метод LaunchPackage, и укажите допустимые значения для входных аргументов, которые указывают на существующий пакет.

    Например, если пакет package1.dtsx хранится на сервере в папке C:\My Packages, передайте file в качестве значения параметра sourceType, C:\My Packages — в качестве значения параметра sourceLocation и package1 (без расширения файла) — в качестве значения параметра packageName.

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

Чтобы получить новейшую документацию, статьи, образцы и видеоматериалы корпорации Майкрософт, а также лучшие решения участников сообщества, посетите страницу служб Integration Services на сайте MSDN:


Чтобы получать автоматические уведомления об этих обновлениях, подпишитесь на RSS-каналы, предлагаемые на этой странице.