Exécution d'un package SSIS par programme sur un ordinateur distant
Si un ordinateur client (local) n'a pas Integration Services installé ou n'a pas accès à toutes les ressources qu'un package requiert, vous devez démarrer le package afin qu'il s'exécute sur l'ordinateur distant où il est stocké. Vous devez effectuer des étapes supplémentaires pour vous assurer que le package s'exécute sur l'ordinateur distant, parce qu'un package s'exécute sur le même ordinateur que l'application qui démarre le package. Donc, si vous exécutez un package distant directement à partir d'une application sur l'ordinateur local, le package se chargera sur l'ordinateur local et s'exécutera à partir de ce dernier. Parce que l'ordinateur local n'a pas non plus Integration Services installé, ou n'a pas accès à toutes les ressources que le package requiert, celui-ci ne s'exécutera pas correctement.
Notes
Un ordinateur client peut ne pas avoir Integration Services installé parce que les conditions de votre licence SQL Server peuvent ne vous pas permettre d'installer Integration Services sur des ordinateurs supplémentaires. (Integration Services est un composant serveur et n'est pas redistribuable aux ordinateurs clients.) Toutefois, si l'ordinateur local a Integration Services installé et a accès à toutes les ressources que le package requiert, vous pouvez utiliser l'ordinateur local pour exécuter un package distant. Pour plus d'informations, consultez Exécution d'un package SSIS par programme sur un ordinateur local.
Pour démarrer le package sur l'ordinateur distant, vous appelez l'un des programmes suivants :
SQL Server Agent.
Une autre application, composant ou service Web qui s'exécute sur l'ordinateur distant.
Rubriques de cette section
|
Conditions préalables pour l'ordinateur distant
Vous devez vous assurer que le processus qui exécute le package sur l'ordinateur distant a les autorisations requises. Ce processus requiert non seulement une autorisation pour démarrer le package, mais aussi pour rechercher et ouvrir toutes les ressources que le package utilise. Les autorisations par défaut sont souvent insuffisantes, surtout dans une solution basée sur le Web. La description complète des autorisations, de l'authentification et de l'autorisation sort de la portée de cette rubrique.
L'emprunt de l'identité d'un autre compte pour exécuter le package n'est pas souvent une bonne solution. Bien que le package démarre sous le compte dont l'identité est empruntée, les threads supplémentaires créés par le package reviennent au compte utilisé par le processus qui a démarré le package. Ces threads incluent les threads utilisés par le flux de données pour charger et enregistrer des données. Par conséquent, le compte de processus lui-même a besoin de l'autorisation d'accès à la plupart des ressources externes utilisées par le package.
Exécution d'un package SSIS à distance en appelant l'Agent SQL Server
L'exemple de code suivant montre comment appeler l'Agent SQL Server par programme pour exécuter un package sur l'ordinateur distant. L'exemple de code appelle la procédure stockée système sp_start_job, qui ensuite lance un travail de l'Agent SQL Server nommé RunSSISPackage et qui se trouve sur l'ordinateur distant. Le travail RunSSISPackage s'exécute alors le package sur l'ordinateur distant sur lequel le travail lui même est exécuté.
Notes
La valeur de retour de la procédure stockée sp_start_job indique si la procédure stockée a pu démarrer correctement le travail de l'Agent SQL Server. La valeur de retour n'indique pas si le package a réussi ou a échoué.
Pour plus d'informations sur la résolution des problèmes liés aux packages que vous exécutez à partir des travaux de l'Agent SQL Server, consultez l'article Microsoft intitulé Un package SSIS n'est pas exécuté lorsque vous appelez le package SSIS à partir d'une étape de travail d'Agent SQL Server.
Exemple de code
Les exemples de code suivants requièrent une référence à l'assembly 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();
}
}
}
Retour en haut
Exécution d'un package SSIS à distance en appelant un composant ou un service distant
Dans la section précédente, la solution pour l'exécution de packages par programme sur un ordinateur distant ne requiert pas de code personnalisé sur l'ordinateur distant. Toutefois, vous pouvez préférer une solution qui ne compte pas sur l'Agent SQL SQL Server pour exécuter des packages.
L'exemple suivant fournit du code partiel qui pourrait être utilisé dans un composant distant ou un service Web sur le serveur pour démarrer des packages Integration Services sur l'ordinateur distant.
Exemple de code
Les exemples de code suivants suggèrent une approche pour la création et le test d'une classe distante qui exécute un package à distance. Ces exemples ne sont pas complets, mais fournissent du code qui pourrait être utilisé dans le cadre d'une solution construite comme un composant distant ou comme un service Web.
Cet exemple requiert une référence à l'assembly Microsoft.SqlServer.ManagedDTS.
Création de la fonction d'exécution du package SSIS à distance
Un package Integration Services peut être chargé directement à partir d'un fichier, directement à partir de SQL Server ou à partir du magasin de packages SSIS, lequel gère le stockage des packages dans SQL Server et des dossiers spéciaux du système de fichiers. Cet exemple prend en charge toutes les options de chargement disponibles en utilisant une construction Select Case ou switch pour sélectionner la syntaxe appropriée au démarrage du package et pour concaténer les arguments d'entrée convenablement.
Important
Les méthodes de la classe Application qui permettent d'utiliser le magasin de packages SSIS prennent uniquement en charge « . », localhost ou le nom du serveur local. Vous ne pouvez pas utiliser « (local) ».
La méthode LaunchPackage renvoie le résultat de l'exécution du package sous la forme d'un entier plutôt que d'une valeur DTSExecResult afin que les ordinateurs clients ne requièrent pas de référence aux assemblys Integration Services.
Important
Cet exemple n'est pas complet, mais fournit du code qui pourrait être utilisé dans le cadre d'une solution construite comme un composant distant ou comme un service Web. L'exemple n'inclut pas le code, les attributs ou les références qui peuvent être obligatoires pour générer et exposer un composant ou service distant.
Pour créer une classe distante afin d'exécuter par programme des packages sur le serveur
Ouvrez Visual Studio et créez un projet du type approprié dans votre langage de programmation préféré.
L'exemple de code suivant utilise le nom LaunchSSISPackageService pour le projet.
Ajoutez une référence à l'assembly Microsoft.SqlServer.ManagedDTS.
Collez l'exemple de code dans le fichier de classe.
L'exemple présente tout le contenu de la fenêtre de code.
Ajoutez le code, les attributs ou les références qui peuvent être obligatoires pour générer et exposer un composant ou service distant.
Générez et testez le projet qui inclut l'exemple de code.
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();
}
}
Appel de la fonction pour exécuter le package SSIS à distance
L'exemple d'application console suivant utilise le composant ou service distant pour exécuter un package.
La méthode LaunchPackage de la classe distante renvoie le résultat de l'exécution du package sous la forme d'un entier plutôt que d'une valeur DTSExecResult afin que les ordinateurs clients ne requièrent pas de référence aux assemblys Integration Services. L'exemple crée une énumération privée dont les valeurs reflètent les valeurs DTSExecResult pour rapporter les résultats de l'exécution.
Pour créer une application console afin de tester la classe distante
Dans Visual Studio, créez une nouvelle application console à l'aide de votre langage de programmation préféré.
L'exemple de code utilise le nom LaunchSSISPackageTest pour le projet.
Ajoutez une référence à l'assembly de proxy local qui représente le composant ou service distant. Si nécessaire, ajustez la déclaration de variable dans l'exemple de code pour le nom que vous attribuez à l'objet proxy.
Collez l'exemple de code pour la routine principale et l'énumération privée dans le code.
L'exemple présente tout le contenu de la fenêtre de code.
Modifiez la ligne de code qui appelle la méthode LaunchPackage afin de fournir un jeu de valeurs valides pour les arguments d'entrée qui pointent vers un package existant.
Par exemple, si package1.dtsx est stocké sur le serveur dans C:\My Packages, passez « file » comme valeur de sourceType, « C:\My Packages » comme valeur de sourceLocation et « package1 » (sans l'extension) comme valeur de 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
};
}
}
Retour en haut
Ressources externes
- Vidéo, Procédure : automatiser l'exécution du package SSIS à l'aide de l'Agent SQL Server (vidéo de SQL Server), sur technet.microsoft.com
|