リモート コンピューターでのプログラムによる SSIS パッケージの実行
クライアント (ローカル) コンピューターで、Integration Services がインストールされていない場合、またはパッケージに必要なリソースがすべて利用できるわけではない場合、パッケージの保存先であるリモート コンピューター上でパッケージが実行されるように、パッケージを起動する必要があります。パッケージをリモート コンピューター上で確実に実行できるようにするには、追加のステップが必要になります。これは、パッケージが、パッケージを起動するアプリケーションと同じコンピューター上で実行されるためです。つまり、ローカル コンピューター上のアプリケーションからリモート パッケージを直接実行すると、パッケージはローカル コンピューターから読み込まれ、実行されます。ローカル コンピューターで、Integration Services がインストールされていないか、またはパッケージに必要なリソースをすべて利用できるわけではない場合、パッケージは正常に実行されません。
注 |
---|
SQL Server ライセンス供与の条件により、Integration Services を追加のコンピューターにインストールできないので、クライアント コンピューターに Integration Services がインストールされていないことがあります (Integration Services はサーバー コンポーネントであるため、クライアント コンピューターに再配布できません)。ただし、ローカル コンピューターに Integration Services がインストールしてあり、パッケージが必要とするすべてのリソースを利用できる場合には、ローカル コンピューターを使用してリモート パッケージを実行することができます。詳細については、「ローカル コンピューターでのプログラムによる SSIS パッケージの実行」を参照してください。 |
リモート コンピューター上のパッケージを起動するには、次のプログラムのいずれかを呼び出します。
SQL Server エージェント
リモート コンピューター上で実行されている別のアプリケーション、コンポーネント、または Web サービス
このトピックのセクション
|
リモート コンピューターの前提条件
リモート コンピューター上でパッケージを実行するプロセスが、必要な権限を保有していることを確認する必要があります。このプロセスで権限が必要とされるのは、パッケージを起動するためだけではなく、パッケージが使用するリソースすべてを見つけて開くためでもあります。既定の権限では不十分な場合もあります (特に、Web ベースのソリューションの場合)。権限、および認証と承認については、このトピックでは説明しません。
多くの場合、別のアカウントを借用してパッケージを実行しても、適切には実行されません。パッケージが借用アカウントで起動しても、パッケージによって作成された追加スレッドは、パッケージを起動したプロセスによって使用されるアカウントに帰属します。このようなスレッドとしては、データの読み込みと保存のためにデータ フローで使用されるスレッドがあります。つまり、プロセス アカウント自体が、パッケージによって使用されるほとんどの外部リソースに対する権限を必要とします。
SQL Server エージェントの呼び出しによる SSIS パッケージのリモート実行
次のサンプル コードでは、プログラムで SQL Server エージェントを呼び出して、リモート コンピューター上でパッケージを実行する方法を示します。このサンプル コードでは、sp_start_job システム ストアド プロシージャを呼び出します。このストアド プロシージャは、リモート コンピューター上にある RunSSISPackage という名前の SQL Server エージェント ジョブを開始します。その後、RunSSISPackage ジョブにより、ジョブ自体が実行されているリモート コンピューターでパッケージが実行されます。
注 |
---|
sp_start_job ストアド プロシージャの戻り値は、このストアド プロシージャが SQL Server エージェント ジョブを正常に開始できたかどうかを示します。この戻り値は、パッケージが成功したか失敗したかを示しません。 |
SQL Server エージェントのジョブから実行されるパッケージのトラブルシューティングについては、Microsoft の記事「SQL Server エージェント ジョブ ステップから SSIS パッケージを呼び出すと、SSIS パッケージは実行されません。」を参照してください。
サンプル コード
次のコード サンプルでは、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 パッケージをリモート コンピューター上で起動するためにリモート コンポーネントまたはサーバー上の Web サービスで使用できるコードの一部を示します。
サンプル コード
次のコード サンプルでは、パッケージをリモートで実行するリモート クラスを作成してテストするための方法が示されています。これらのサンプルは完成版ではなく、リモート コンポーネントまたは Web サービスとして構築されたソリューションの一部として使用できるコードを示しています。
これらのサンプルでは、Microsoft.SqlServer.ManagedDTS アセンブリへの参照が必要です。
SSIS パッケージをリモートで実行する関数の作成
Integration Services パッケージは、ファイルや SQL Server から直接読み込んだり、SSIS パッケージ ストアから読み込んだりすることができます。SSIS パッケージ ストアは、SQL Server および特別なファイル システム フォルダー内のパッケージ ストレージを管理します。読み込みオプションをすべてサポートするために、このサンプルでは Select Case コンストラクトまたは switch コンストラクトを使用して、パッケージを起動するための適切な構文を選択し、入力引数を適切に連結します。
重要 |
---|
SSIS パッケージ ストアを操作するための Application クラスのメソッドは、"."、localhost、またはローカル サーバーのサーバー名のみをサポートします。"(local)" は使用できません。 |
LaunchPackage メソッドは、パッケージの実行結果を DTSExecResult 値ではなく、整数として返します。これは、クライアント コンピューターで Integration Services アセンブリへの参照が不要になるようにするためです。
重要 |
---|
このサンプルは完成版ではなく、リモート コンポーネントまたは Web サービスとして構築されたソリューションの一部として使用できるコードを示しています。サンプルには、コード、属性、および参照は含まれません。これらは、リモートのコンポーネントまたはサービスの構築および公開で必要となる場合があります。 |
プログラムによってサーバー上でパッケージを実行するためのリモート クラスを作成するには
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 に格納されている場合、sourceType の値として "file"、sourceLocation の値として "C:\My Packages"、packageName の値として "package1" (拡張子なし) を渡します。
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
};
}
}
トップに戻る
外部リソース
- technet.microsoft.com のビデオ「SQL Server エージェントを使用して SSIS パッケージ実行を自動化する方法 (SQL Server ビデオ)」
|