次の方法で共有


プログラムによるリモート パッケージの読み込みと実行

適用対象:SQL Server Azure Data Factory の SSIS 統合ランタイム

Integration Services がインストールされていないローカル コンピューターからリモート パッケージを実行するには、Integration Services がインストールされているリモート コンピューターで実行されるようにパッケージを起動します。 この目標を達成するには、ローカル コンピューターで SQL Server エージェント、Web サービス、またはリモート コンポーネントを使用して、リモート コンピューターでパッケージを起動させます。 リモート パッケージをローカル コンピューターから直接起動しようとすると、パッケージが読み込まれるので、ローカル コンピューターから実行を試みます。 ローカル コンピューターに Integration Services がインストールされていない場合、パッケージは実行されません。

Note

Integration Services がインストールされていない限り、クライアント コンピューターで SQL Server Data Tools の外部でパッケージを実行することはできません。 SQL Server ライセンスの使用条件では、Integration Services を他のコンピューターにインストールできない場合があります。 Integration Services はサーバー コンポーネントであり、クライアント コンピューターに再頒布可能ではありません。

または、Integration Services がインストールされているローカル コンピューターからリモート パッケージを実行することもできます。 詳細については、「プログラムによるローカル パッケージの読み込みと実行」を参照してください。

リモート コンピューターでのリモート パッケージの実行

リモート サーバーでリモート パッケージを実行する方法は複数あります。

このトピックでパッケージを読み込み、保存するために使用するほとんどすべてのメソッドには、Microsoft.SqlServer.ManagedDTS アセンブリへの参照が必要です。 例外は、System.Data と Microsoft.Data.SqlClient への参照のみを必要とするsp_start_job ストアド プロシージャを実行するための ADO.NET アプローチです。 Microsoft.SqlServer.ManagedDTS アセンブリへの参照を新しいプロジェクトに追加した後、Microsoft.SqlServer.Dts.Runtime または Imports ステートメントを使用して 名前空間をインポートします。

SQL Server エージェントを使用した、サーバー上でのプログラムによるリモート パッケージの実行

次のコード例では、プログラムで SQL Server エージェントを使用して、サーバー上のリモート パッケージを実行する方法を示します。 このコード例では、sp_start_job システム ストアド プロシージャを呼び出し、SQL Server エージェント ジョブを開始します。 プロシージャによって開始されるジョブの名前は RunSSISPackage で、このジョブはリモート コンピューターに保存されています。 その後、RunSSISPackage ジョブにより、リモート コンピューターでパッケージが実行されます。

Note

sp_start_job ストアド プロシージャの戻り値は、ストアド プロシージャが SQL Server エージェントのジョブを正常に開始できたかどうかを示します。 戻り値は、パッケージが成功したか失敗したかを示しません。

SQL Server エージェントのジョブから実行するパッケージのトラブルシューティングについては、Microsoft の記事「SQL Server エージェントのジョブ ステップから SSIS パッケージを呼び出したときに SSIS パッケージが実行されない」を参照してください。

サンプル コード

Imports System.Data  
Imports Microsoft.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, RunSSISPackage, started successfully.")  
      Case Else  
        Console.WriteLine("SQL Server Agent job, RunSSISPackage, failed to start.")  
    End Select  
    Console.Read()  
  
  End Sub  
  
End Module  
using System;  
using System.Data;  
using Microsoft.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, RunSSISPackage, started successfully.");  
          break;  
        default:  
          Console.WriteLine("SQL Server Agent job, RunSSISPackage, failed to start.");  
          break;  
      }  
      Console.Read();  
    }  
  }  
}  

Web サービスまたはリモート コンポーネントを使用した、プログラムによるリモート パッケージの実行

サーバー上でプログラムによってパッケージを実行するための前のソリューションでは、サーバー上のカスタム コードは必要ありません。 ただし、SQL Server エージェントに依存しないソリューションを使用してパッケージを実行することをお勧めします。 次の例では、Integration Services パッケージをローカルで開始する Web サービスと、クライアント コンピューターから Web サービスを呼び出すテスト アプリケーションをサーバー上に作成する方法を示します。 Web サービスではなくリモート コンポーネントを作成する場合は、リモート コンポーネントにほとんど変更を加えずに同じコード ロジックを使用できます。 ただし、リモート コンポーネントでは、Web サービスよりも広範な構成が必要になる場合があります。

重要

認証と承認の既定の設定では、通常、Web サービスには、パッケージを読み込んで実行するための SQL Server またはファイル システムにアクセスするための十分なアクセス許可がありません。 web.config ファイルで認証と承認の設定を構成し、必要に応じてデータベースとファイル システムのアクセス許可を割り当てることで、Web サービスに適切なアクセス許可を割り当てる必要がある場合があります。 Web、データベース、およびファイル システムの権限の詳細については、このトピックでは説明しません。

重要

SSIS パッケージ ストアを操作するための Application クラスのメソッドでは、"."、localhost、またはローカル サーバーのサーバー名のみがサポートされます。 "(local)" は使用できません。

サンプル コード

次のコード例では、Web サービスを作成およびテストする方法を示します。

Web サービスの作成

Integration Services パッケージは、ファイル、SQL Server、または SSIS パッケージ ストアから直接読み込むことができます。 SSIS パッケージ ストアは、SQL Server と特殊なファイル システム フォルダーの両方のパッケージ ストレージを管理します。 このサンプルは、Select Case または switch コンストラクトを使用してパッケージを起動するための適切な構文を選択し、入力引数を適切に連結することで、すべての使用可能なオプションをサポートしています。 LaunchPackage Web サービス メソッドは、クライアント コンピューターが Integration Services アセンブリへの参照を必要としないように、 DTSExecResult 値ではなく、パッケージ実行の結果を整数として返します。

プログラムによってサーバー上でパッケージを実行するための Web サービスを作成するには
  1. Visual Studio を開き、任意のプログラミング言語で Web サービス プロジェクトを作成します。 サンプル コードでは、プロジェクトに LaunchSSISPackageService という名前を使用します。

  2. Microsoft.SqlServer.ManagedDTS への参照を追加し、Microsoft.SqlServer.Dts.Runtime 名前空間のためにコード ファイルに Imports または using ステートメントを追加します。

  3. LaunchPackage Web サービス メソッドのサンプル コードをクラスに貼り付けます (このサンプルはコード ウィンドウの内容全体を表しています)。

  4. LaunchPackage メソッドの入力引数に既存のパッケージを指し示す一連の有効な値を指定することにより、Web サービスをビルドしてテストします。 たとえば、package1.dtsx がサーバーの C:\My Packages に格納されている場合、sourceType の値として "file"、sourceLocation の値として "C:\My Packages"、packageName の値として "package1" (拡張子なし) を渡します。

Imports System.Web  
Imports System.Web.Services  
Imports System.Web.Services.Protocols  
Imports Microsoft.SqlServer.Dts.Runtime  
Imports System.IO  
  
<WebService(Namespace:="https://dtsue/")> _  
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _  
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _  
Public Class LaunchSSISPackageService  
  Inherits System.Web.Services.WebService  
  
  ' 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  
  
  <WebMethod()> _  
  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 System;  
using System.Web;  
using System.Web.Services;  
using System.Web.Services.Protocols;  
using Microsoft.SqlServer.Dts.Runtime;  
using System.IO;  
  
[WebService(Namespace = "https://dtsue/")]  
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]  
public class LaunchSSISPackageServiceCS : System.Web.Services.WebService  
{  
  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  
  
  [WebMethod]  
  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();  
  
  }  
  
}  

Web サービスのテスト

次のサンプル コンソール アプリケーションでは、Web サービスを使用してパッケージを実行します。 Web サービスの LaunchPackage メソッドは、クライアント コンピューターが Integration Services アセンブリへの参照を必要としないように、 DTSExecResult 値ではなく、パッケージ実行の結果を整数として返します。 このサンプルでは、実行結果を報告するために、DTSExecResult 値を反映する値を持つプライベート列挙を作成します。

Web サービスをテストするためのコンソール アプリケーションを作成するには
  1. Visual Studio で任意のプログラミング言語を使用して、新しいコンソール アプリケーションを、Web サービス プロジェクトと同じソリューションに追加します。 サンプル コードでは、プロジェクトに LaunchSSISPackageTest という名前を使用します。

  2. 新しいコンソール アプリケーションをソリューションのスタートアップ プロジェクトとして設定します。

  3. Web サービス プロジェクトの Web 参照を追加します。 必要に応じて、Web サービス プロキシ オブジェクトに割り当てた名前に合わせて、サンプル コードの変数宣言を調整します。

  4. Main ルーチンとプライベート列挙のサンプル コードをコードに貼り付けます (このサンプルはコード ウィンドウの内容全体を表しています)。

  5. 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  
      ' The type of exception returned by a Web service is:  
      '  System.Web.Services.Protocols.SoapException  
      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)  
      {  
        // The type of exception returned by a Web service is:  
        //  System.Web.Services.Protocols.SoapException  
        Console.WriteLine("The following exception occurred: " + ex.Message);  
      }  
  
      Console.WriteLine(((PackageExecutionResult)packageResult).ToString());  
      Console.ReadKey();  
  
    }  
  
    private enum PackageExecutionResult  
    {  
      PackageSucceeded,  
      PackageFailed,  
      PackageCompleted,  
      PackageWasCancelled  
    };  
  
  }  
}  

外部リソース

ローカル実行とリモート実行の相違点について
プログラムによるローカル パッケージの読み込みと実行
ローカル パッケージの出力の読み込み