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

  • Exécution d'un package à distance en appelant l'Agent SQL Server

  • Exécution d'un package à distance en appelant un composant ou service distant

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

  1. 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.

  2. Ajoutez une référence à l'assembly Microsoft.SqlServer.ManagedDTS.

  3. Collez l'exemple de code dans le fichier de classe.

    L'exemple présente tout le contenu de la fenêtre de code.

  4. 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.

  5. 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

  1. 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.

  2. 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.

  3. 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.

  4. 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

Icône Integration Services (petite) Rester à jour avec Integration Services

Pour obtenir les derniers téléchargements, articles, exemples et vidéos de Microsoft, ainsi que des solutions sélectionnées par la communauté, visitez la page Integration Services sur MSDN :


Pour recevoir une notification automatique de ces mises à jour, abonnez-vous aux flux RSS disponibles sur la page.