在遠端電腦上以程式設計方式執行 SSIS 封裝
如果用戶端 (本機) 電腦未安裝 Integration Services 或沒有封裝所需資源的存取權,您必須啟動封裝,以便在儲存封裝所在的遠端電腦上執行封裝。因為在同一部電腦上應用程式啟動封裝以及執行封裝,您必須採取額外步驟,以確保在遠端電腦上執行封裝。如果您直接從本機電腦上的應用程式執行遠端封裝,該封裝將載入並嘗試從本機電腦執行。因為本機電腦未安裝 Integration Services 或沒有封裝所需資源的存取權,將無法順利執行封裝。
[!附註]
因為 SQL Server 授權條款無法讓您在其他電腦上安裝 Integration Services,用戶端電腦可能未安裝 Integration Services (Integration Services 是伺服器元件,不可轉散發至用戶端電腦)。不過如果本機電腦已安裝 Integration Services 且有封裝所需資源的存取權,您就可以使用本機電腦來執行遠端封裝。如需詳細資訊,請參閱<以程式設計的方式在本機電腦上執行 SSIS 封裝>。
若要在遠端電腦上啟動封裝,您可以呼叫下列其中一個程式:
SQL Server Agent。
在遠端電腦上執行的另一個應用程式、元件或 Web 服務。
本主題的章節
|
遠端電腦的必要條件
您必須確定在遠端電腦上執行封裝的程序擁有必要權限。此程序不但需要啟動封裝的權限,還需要尋找及開啟封裝所使用之所有資源的權限。預設權限通常不足,尤其是在 Web 架構方案的情況下。權限、驗證和授權的完整討論不在本主題的範圍之內。
模擬另一個帳戶來執行封裝,通常不是成功方案。儘管封裝會在模擬帳戶下啟動,但是封裝所建立的其他執行緒會還原為啟動封裝之程序所使用的帳戶。這些執行緒包含載入及儲存資料的資料流程所使用的執行緒。因此,處理帳戶本身需要封裝所使用之大部分外部資源的權限。
透過呼叫 SQL Server Agent,從遠端執行 SSIS 封裝
下列程式碼範例示範如何以程式設計方式呼叫 SQL Server Agent,在遠端電腦上執行封裝。範例程式碼會呼叫系統預存程序 sp_start_job,它將會啟動位於遠端電腦上的 SQL Server Agent 作業 (名稱為 RunSSISPackage)。RunSSISPackage 作業接著會在作業本身執行所在的遠端電腦上執行封裝。
[!附註]
sp_start_job 預存程序的傳回值指出預存程序是否能夠順利啟動 SQL Server Agent 作業。傳回值不會指出封裝是成功或是失敗。
如需有關從 SQL Server Agent 作業執行之封裝的疑難排解詳細資訊,請參閱 Microsoft 文件<從 SQL Server Agent 作業步驟呼叫 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 Agent 的方案來執行封裝。
下列範例提供部分程式碼,可供伺服器上的遠端元件或 Web 服務啟動遠端電腦上的 Integration Services 封裝。
範例程式碼
下列程式碼範例示範如何建立及測試可從遠端執行封裝的遠端類別。這些範例並不完整,但提供的程式碼可做為建置為遠端元件或 Web 服務之方案的一部分。
這些範例需要使用 Microsoft.SqlServer.ManagedDTS 組件的參考。
建立函數,從遠端執行 SSIS 封裝
Integration Services 封裝可以直接從檔案、直接從 SQL Server 或從 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 做為專案的名稱。
加入代表遠端元件或服務之本機 Proxy 組件的參考。若有需要,請在範例程式碼中,為指派到 Proxy 物件的名稱,調整變數宣告。
將 Main 常式與私用列舉的範例程式碼貼到程式碼中。
範例顯示程式碼視窗的整個內容。
編輯呼叫 LaunchPackage 方法的程式碼行,為其輸入引數提供一組指向現有封裝的有效值。
例如,如果 package1.dtsx 是儲存在伺服器上的 C:\My Packages 中,則傳遞 "file" 做為 sourceType 的值,傳遞 "C:\My Packages" 做為 sourceLocation 的值,並傳遞 "package1" (沒有副檔名) 做為 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
};
}
}
回到頁首
外部資源
- 位於 technet.microsoft.com 的視訊:如何:使用 SQL Server Agent 讓 SSIS 封裝執行自動化 (SQL Server 視訊)
|