Programmgesteuertes Ausführen eines SSIS-Pakets auf einem Remotecomputer

Wenn auf einem Clientcomputer (lokal) Integration Services nicht installiert ist, oder dieser keinen Zugriff auf alle Ressourcen hat, die ein Paket erfordert, müssen Sie das Paket starten, sodass das Paket auf dem Remotecomputer ausgeführt wird, auf dem das Paket gespeichert ist. Sie müssen zusätzliche Schritte unternehmen, um sicherzustellen, dass das Paket auf dem Remotecomputer ausgeführt wird, da ein Paket auf dem gleichen Computer wie die Anwendung ausgeführt wird, die das Paket startet. Wenn Sie daher ein Remotepaket direkt von einer Anwendung auf dem lokalen Computer ausführen, wird das Paket auf dem lokalen Computer geladen und dort ausgeführt. Da auf dem lokalen Computer entweder Integration Services nicht installiert ist oder dieser keinen Zugriff auf alle Ressourcen hat, die das Paket erfordert, wird das Paket nicht erfolgreich ausgeführt werden.

HinweisHinweis

Möglicherweise ist Integration Services nicht auf einem Clientcomputer installiert, weil die Bedingungen Ihrer SQL Server-Lizenz Ihnen nicht gestatten, Integration Services auf zusätzlichen Computern zu installieren. (Bei Integration Services handelt es sich um eine Serverkomponente, die nicht an Clientcomputer weitergegeben werden darf.) Wenn jedoch auf dem lokalen Computer Integration Services installier ist, und dieser Zugriff auf alle Ressourcen hat, die das Paket erfordert, können Sie mithilfe des lokalen Computers ein Remotepaket ausführen. Weitere Informationen finden Sie unter Programmgesteuertes Ausführen eines SSIS-Pakets auf dem lokalen Computer.

Um das Paket auf dem Remotecomputer zu starten, rufen Sie eines der folgenden Programme auf:

  • SQL Server-Agent

  • Eine andere Anwendung, eine andere Komponente oder ein anderer Webdienst, die auf dem Remotecomputer ausgeführt werden

Kapitel in diesem Thema

  • Erforderliche Komponenten für den Remotecomputer

  • Remoteausführung eines Pakets durch das Aufrufen von SQL Server-Agent

  • Remoteausführung eines Pakets durch das Aufrufen einer Remotekomponente oder eines Remotediensts

Erforderliche Komponenten für den Remotecomputer

Sie müssen sicherstellen, dass der Prozess, der das Paket auf dem Remotecomputer ausführt, über die erforderlichen Berechtigungen verfügt. Dieser Prozess erfordert die Berechtigung, nicht nur das Paket zu starten, sondern auch alle Ressourcen zu finden, die das Paket verwendet, und diese zu öffnen. Die Standardberechtigungen sind häufig nicht genügend, besonders in einer webbasierten Lösung. Eine vollständige Beschreibung der Berechtigungen sowie der Authentifizierung und Autorisierung ist nicht Gegenstand dieses Themas.

Die Durchführung eines Identitätswechsels zu einem anderen Konto, um das Paket auszuführen, ist oft keine erfolgreiche Lösung. Obwohl das Paket unter dem Konto mit Identitätswechsel gestartet wird, kehren die weiteren Threads, die vom Paket erstellt werden, wieder zum Konto zurück, das von dem Prozess verwendet wird, der das Paket gestartet hat. Diese Threads enthalten die vom Datenfluss zu Last verwendeten Threads und speichern Daten. Daher benötigt das Prozesskonto selbst die Berechtigung für die meisten der externen Ressourcen, die vom Paket verwendet wurden.

Remoteausführung eines SSIS-Pakets durch das Aufrufen von SQL Server-Agent

Im folgenden Beispielcode wird das programmgesteuerte Aufrufen von SQL Server-Agent zum Ausführen eines Remotepakets auf dem Remotecomputer gezeigt. Im Beispielcode wird die gespeicherte Systemprozedur aufgerufen, sp_start_job, die dann einen SQL Server-Agent-Auftrag startet, der RunSSISPackage genannt wird und der sich auf dem Remotecomputer befindet. Der RunSSISPackage-Auftrag führt das Paket auf dem Remotecomputer aus, auf dem der Auftrag selbst ausgeführt wird.

HinweisHinweis

Der Rückgabewert der gespeicherten Prozedur sp_start_job gibt an, ob die gespeicherte Prozedur den SQL Server-Agent-Auftrag starten konnte. Der Rückgabewert gibt nicht an, ob beim Ausführen des Pakets ein Fehler aufgetreten ist.

Weitere Informationen zur Fehlerbehebung bei der Ausführung von Paketen in SQL Server-Agent-Aufträgen finden Sie im Microsoft-Artikel SSIS-Paket wird nicht ausgeführt, wenn das SSIS-Paket von einem SQL Server Agent-Auftrag abgerufen wird.

Beispielcode

Die folgenden Codebeispiele erfordern einen Verweis auf die System.Data-Assembly.

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();
    }
  }
}

Zurück zum Anfang

Remoteausführung eines SSIS-Pakets durch das Aufrufen einer Remotekomponente oder eines Remotediensts

Im vorherigen Abschnitt erfordert die Lösung zum programmgesteuerten Ausführen von Paketen auf einem Remotecomputer keinen benutzerdefinierten Code auf dem Remotecomputer. Möglicherweise bevorzugen Sie jedoch eine Lösung, die sich nicht auf den SQL Server Agent für das Ausführen von Paketen verlässt.

Im folgenden Beispiel wird Teilcode bereitgestellt, der in einer Remotekomponente oder in einem Webdienst auf dem Server verwendet werden kann, um Integration Services-Pakete auf dem Remotecomputer zu starten.

Beispielcode

In den folgenden Codebeispielen wird ein Ansatz zum Erstellen und Testen einer Remoteklasse vorgeschlagen, die ein Paket remote ausführt. Diese Beispiele sind nicht vollständig, stellen jedoch Code bereit, der als Teil einer Lösung verwendet werden kann, die als Remotekomponente oder als Remotewebdienst erstellt wird.

Dieses Beispiel erfordert einen Verweis auf die Microsoft.SqlServer.ManagedDTS-Assembly.

Erstellen der Funktion für die Remoteausführung des SSIS-Pakets

Ein Integration Services-Paket kann direkt aus einer Datei, direkt aus SQL Server oder aus dem SSIS-Paketspeicher geladen werden, der die Paketspeicherung sowohl in SQL Server-Ordnern als auch in speziellen Dateisystemordnern verwaltet. Um alle verfügbaren Optionen für das Laden zu unterstützen, verwendet dieses Beispiel ein Select Case- oder ein switch-Konstrukt, um die geeignete Syntax zum Starten des Pakets auszuwählen und die Eingabeargumente entsprechend zu verketten.

Wichtiger HinweisWichtig

Die Methoden der Application-Klasse für das Funktionieren mit dem SSIS-Paketspeicher unterstützen nur ".", localhost oder den Namen des lokalen Servers. Sie können "(local)" nicht verwenden.

Die LaunchPackage-Methode gibt das Ergebnis der Paketausführung als ganze Zahl zurück und nicht als DTSExecResult-Wert, sodass Clientcomputer keinen Verweis auf Integration Services-Assemblys benötigen.

Wichtiger HinweisWichtig

Dieses Beispiel sind nicht vollständig, stellt jedoch Code bereit, der als Teil einer Lösung verwendet werden kann, die als Remotekomponente oder als Remotewebdienst erstellt wird. Das Beispiel schließt den Code, die Attribute oder die Verweise nicht ein, die möglicherweise erforderlich sind, um eine Remotekomponente oder einen Dienst zu erstellen und verfügbar zu machen.

So erstellen Sie eine Remoteklasse zum programmgesteuerten Ausführen von Paketen auf dem Server

  1. Öffnen Sie Visual Studio, und erstellen Sie in der bevorzugten Programmiersprache ein Projekt vom entsprechenden Typ.

    Im folgenden Beispielcode wird der Name LaunchSSISPackageService für das Projekt verwendet.

  2. Fügen Sie der Microsoft.SqlServer.ManagedDTS-Assembly einen Verweis hinzu.

  3. Fügen Sie den Beispielcode in die Klassendatei ein.

    Im folgenden Beispiel wird der gesamte Inhalt des Codefensters dargestellt.

  4. Fügen Sie den Code, die Attribute oder die Verweise hinzu, die möglicherweise erforderlich sind, um eine Remotekomponente oder einen Dienst zu erstellen und verfügbar zu machen.

  5. Erstellen und testen Sie das Projekt, das den Beispielcode enthält.

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();

  }

}

Aufrufen der Funktion für die Remoteausführung des SSIS-Pakets

Im folgenden Beispiel für eine Konsolenanwendung werden die Remotekomponente oder der Remotewebdienst zum Ausführen eines Pakets verwendet.

Die LaunchPackage -Methode der Remoteklasse gibt das Ergebnis der Paketausführung als ganze Zahl zurück und nicht als DTSExecResult-Wert, sodass Clientcomputer keinen Verweis auf Integration Services-Assemblys benötigen. Mit dem Beispiel wird zum Melden der Ausführungsergebnisse eine private Enumeration erstellt, deren Werte die DTSExecResult-Werte spiegeln.

So erstellen Sie eine Konsolenanwendung zum Testen der Remoteklasse

  1. Erstellen Sie in Visual Studio eine neue Konsolenanwendung, die die gewünschte Programmiersprache verwendet.

    Im Beispielcode wird der Name LaunchSSISPackageTest für das Projekt verwendet.

  2. Fügen Sie einen Verweis auf die lokale Proxyassembly hinzu, die die Remotekomponente oder den Dienst darstellt. Passen Sie ggf. die Variablendeklaration im Beispielcode für den Namen an, den Sie dem Proxyobjekt zuweisen.

  3. Fügen Sie den Beispielcode für die Hauptroutine und die private Enumeration in den Code ein.

    Im folgenden Beispiel wird der gesamte Inhalt des Codefensters dargestellt.

  4. Bearbeiten Sie die Codezeile, die die LaunchPackage -Methode aufruft, um eine Reihe gültiger Werte für die Eingabeargumente bereitzustellen, die auf ein vorhandenes Paket zeigen.

    Beispiel: Wenn package1.dtsx auf dem Server im Verzeichnis C:\My Packages gespeichert ist, übergeben Sie file als Wert von sourceType, C:\My Packages als Wert von sourceLocation, und package1 (ohne die Erweiterung) als Wert von 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
    };

  }
}

Zurück zum Anfang

Externe Ressourcen

Integration Services (kleines Symbol) Bleiben Sie mit Integration Services auf dem neuesten Stand

Die neuesten Downloads, Artikel, Beispiele und Videos von Microsoft sowie ausgewählte Lösungen aus der Community finden Sie auf MSDN auf der Integration Services-Seite:


Abonnieren Sie die auf der Seite verfügbaren RSS-Feeds, um automatische Benachrichtigungen zu diesen Aktualisierungen zu erhalten.