Программный запуск пакета служб SSIS на удаленном компьютере
Если на клиентском (локальном) компьютере нет установленных служб Integration Services или нет доступа ко всем необходимым пакету ресурсам, необходимо запустить пакет на удаленном компьютере, где он хранится. Необходимо выполнить дополнительные шаги и убедиться, что пакет запущен на удаленном компьютере, поскольку пакет запускается на том же компьютере, что и приложение, запускающее пакет. Если запустить удаленный пакет непосредственно из приложения на локальном компьютере, пакет будет загружен на локальный компьютер и будет запущен оттуда. Поскольку на локальном компьютере не установлены службы Integration Services или нет доступа ко всем необходимым пакету ресурсам, не удастся успешно запустить пакет.
Примечание |
---|
На клиентском компьютере могут быть не установлены службы Integration Services, поскольку условия лицензионного соглашения SQL Server не позволяют устанавливать Integration Services на дополнительные компьютеры. (Службы Integration Services являются серверным компонентом и не распространяются на клиентских компьютерах.) Однако если на локальном компьютере установлены службы Integration Services и есть доступ ко всем необходимым пакету ресурсам, можно использовать локальный компьютер для запуска удаленного пакета. Дополнительные сведения см. в разделе Программный запуск пакета служб SSIS на локальном компьютере. |
Чтобы запустить пакет на удаленном компьютере, вызовите одну из следующих программ.
Агент 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.
Важно! |
---|
Этот образец не является завершенным, но предоставляет код, который может использоваться как часть решения, построенного в виде удаленного компонента или веб-службы. Образец не содержит код, атрибуты или ссылки, которые могут потребоваться для построения или обеспечения доступа к удаленным компонентам или службам. |
Создание удаленного класса для запуска пакетов на сервере программным способом
Откройте Visual Studio и создайте проект соответствующего типа на предпочитаемом языке программирования.
Следующий образец кода использует имя LaunchSSISPackageService для проекта.
Добавьте ссылку в сборку Microsoft.SqlServer.ManagedDTS.
Вставьте образец кода в файл класса.
В этом образце приводится полное содержимое окна кода.
Добавьте код, атрибуты или ссылки, которые могут потребоваться для построения или обеспечения доступа к удаленным компонентам или службам.
Постройте и протестируйте проект, включающий в себя образец кода.
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, составляя отчет о результатах выполнения.
Создание консольного приложения для проверки удаленного класса
В Visual Studio создайте новое консольное приложение на предпочитаемом языке программирования.
В образце кода для проекта используется имя LaunchSSISPackageTest для проекта.
Добавьте ссылку на локальную сборку прокси, представляющую удаленные компоненты или службы. При необходимости измените декларацию переменной в образце кода на имя, назначенное для объекта учетной записи-посредника.
Вставьте образец кода для подпрограммы Main и закрытого перечисления в код.
В этом образце приводится полное содержимое окна кода.
Измените строку кода, которой вызывается метод 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
};
}
}
В начало
Внешние ресурсы
- Видеоматериал Как автоматизировать выполнение пакета служб SSIS с помощью агента SQL Server (видеоматериалы по SQL Server) на сайте technet.microsoft.com.
|