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.
Hinweis |
---|
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
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.
Hinweis |
---|
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.
Wichtig |
---|
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.
Wichtig |
---|
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
Ö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.
Fügen Sie der Microsoft.SqlServer.ManagedDTS-Assembly einen Verweis hinzu.
Fügen Sie den Beispielcode in die Klassendatei ein.
Im folgenden Beispiel wird der gesamte Inhalt des Codefensters dargestellt.
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.
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
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.
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.
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.
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
- Video Vorgehensweise: Automatisieren der SSIS-Paketausführung mit dem SQL Server-Agent (SQL Server-Video) auf technet.microsoft.com
|