從 SQL Server Agent 作業步驟呼叫 SSIS 封裝時,SSIS 封裝未執行

徵狀
當您從 SQL Server Agent 作業步驟呼叫 Microsoft SQL Server 2005 Integration Services (SSIS) 封裝時,SSIS 封裝未執行。不過,如果您沒有修改 SSIS 封裝,封裝將會在 SQL Server Agent 外部成功執行。
發生的原因
如果下列其中一種情況成立,就會發生這個問題:
  • 用於在 SQL Server Agent 下執行封裝的使用者帳戶與原始封裝的作者不同。
  • 使用者帳戶沒有進行連線或在 SSIS 封裝外部存取資源的必要權限。
封裝可能無法在下列情況中執行:
  • 目前的使用者無法從封裝解密。如果目前的帳戶或執行帳戶與原始封裝的作者不同,而且封裝的 ProtectionLevel 屬性設定不允許目前使用者在封裝中解密,就會發生這種情況。
  • 由於目前使用者沒有必要的權限,因此使用整合安全性的 SQL Server 連線失敗。
  • 檔案存取失敗,因為目前使用者沒有寫入連接管理員所存取之檔案共用的必要權限。例如,不使用登入和密碼的文字記錄檔提供者就會發生這種情況。這種情況也會發生在與檔案連接管理員有關的工作上,例如 SSIS 檔案系統工作。
  • 依據 登錄的 SSIS 封裝設定使用 HKEY_CURRENT_USER 登錄機碼。HKEY_CURRENT_USER 登錄機碼是使用者特定的。
  • 工作或連接管理員要求目前使用者帳戶必須具有正確的權限。
解決方案
如果要解決這個問題,請使用下列其中一個方法。最適合的方法需視環境以及封裝失敗的原因而定。

方法 1:使用 SQL Server Agent Proxy 帳戶

建立 SQL Server Agent Proxy 帳戶。這個 Proxy 帳戶必須使用認證,讓 SQL Server Agent 像建立封裝的帳戶或具有必要權限的帳戶一樣執行作業。

這個方法可用於解密並滿足使用者的金鑰需求。然而,這種方法的成功可能有限,因為 SSIS 封裝使用者金鑰包含目前使用者和目前電腦。因此,如果您將封裝移到另一台電腦,即使作業步驟使用正確的 Proxy 帳戶,這種方法仍然可能會失敗。

方法 2:將 SSIS 封裝 ProtectionLevel 屬性設定為 ServerStorage

將 SSIS 封裝 ProtectionLevel 屬性變更為 ServerStorage。這個設定會透過 SQL Server 資料庫角色將封裝儲存在 SQL Server 資料庫中並允取存取控制。

方法 3:將 SSIS 封裝 ProtectionLevel 屬性設定為 EncryptSensitiveWithPassword

將 SSIS 封裝 ProtectionLevel 屬性變更為 EncryptSensitiveWithPassword。這個設定會使用密碼進行加密。然後您可以將 SQL Server Agent 作業步驟命令列修改為加入這個密碼。

方法 4:使用 SSIS 封裝設定檔案

使用 SSIS 封裝設定檔案來儲存機密資訊,然後將這些設定檔案儲存在受安全保護的資料夾中。接著您可以將 ProtectionLevel 屬性變更為 DontSaveSensitive,讓封裝不會加密也不會嘗試將機密儲存在封裝中。當您執行 SSIS 封裝時,會從設定檔案載入必要的資訊。如果設定檔案含有機密資訊,確定它們會受到適當的保護。

方法 5:建立封裝範本

如需長期的解決方案,請建立使用與預設設定不同保護等級的封裝範本。這個問題將不會發生在未來的封裝中。
狀況說明
這是原本設計的做法,
其他相關資訊

重現問題的步驟

  1. 以不屬於 SQLServer2005SQLAgentUser 群組的使用者身分登入。例如,您可以建立本機使用者。
  2. 建立 SSIS 封裝,然後加入 ExecuteSQL 工作。透過下列字串使用本機 msdb 檔案的 OLEDB 連接管理員:'Windows Authentication' -SQLSourceType:"Direct Input" -SQLStatement:"sp_who"
  3. 執行封裝以確定執行成功。
  4. 請注意,ProtectionLevel 屬性是設定為 EncryptSensitiveWithPassword。
  5. 建立 SQL Server Agent 作業及作業步驟。在 [執行身分] 清單中,按一下 [SQL Server Agent 服務] 以執行作業步驟。
SQL Server Agent 作業歷程記錄中的文字會顯示類似下列的資訊:

以下列使用者的身分執行:DOMAIN\USERNAME。封裝執行失敗。步驟失敗。

解密封裝

SSIS 封裝 ProtectionLevel 屬性的預設設定為 EncryptSensitiveWithUserKey。儲存封裝時,SSIS 只加密含有標示為「機密」的屬性的部分封裝,例如密碼、使用者名稱和連線字串。因此,當重新載入封裝時,目前的使用者必須滿足要解密的機密屬性的加密需求。然而,目前的使用者並不需要滿足載入封裝的加密需求。當您透過 SQL Server Agent 作業步驟執行封裝時,預設的帳戶是 SQL Server Agent 服務帳戶。這個預設帳戶很有可能是和封裝作者不同的使用者。因此,雖然 SQL Server Agent 作業步驟可以載入並啟動以執行作業步驟,但是封裝仍會失敗,因為它無法完成連線。例如,封裝無法完成 OLE DB 連線或 FTP 連線。封裝失敗是因為它無法解密必須連線的認證。

重要 請考慮開發過程和環境,以判斷各電腦上有哪些需要及使用的帳戶。ProtectionLevel 屬性的 EncryptSensitiveWithUserKey 設定是一項功能強大的設定。您不得忽略這個設定,因為它會造成部署在開始時的複雜性。當您登入適當的帳戶時,可以加密封裝。您也可以透過 .cmd 檔案和 SQL Server Agent 命令子系統,使用 Dtutil.exe SSIS 命令列公用程式變更保護等級。例如,請依照下列步驟執行。由於您可以在批次檔和迴圈中使用 Dtutil.exe 公用程式,因此可以同時針對數個封裝執行這些步驟。
  1. 使用密碼來修改要加密的封裝。
  2. 透過 [作業系統 (cmd Exec)] SQL Server Agent 作業步驟使用 Dtutil.exe 公用程式,將 ProtectionLevel 屬性變更為 EncryptSensitiveWithUserKey。這個程序包含使用密碼解密封裝,然後重新加密封裝。用於加密封裝的使用者金鑰為 [執行身分] 清單中的 SQL Server Agent 作業步驟設定。

    注意 由於金鑰包含使用者名稱和電腦名稱,因此將封裝移至另一台電腦的效能可能很有限。

確定您具有關於 SSIS 封裝失敗的詳細錯誤資訊

您可以使用 SSIS 記錄來確定您具有關於 SSIS 封裝失敗的錯誤資訊,而不需要依賴 SQL Server Agent 作業歷程記錄中有限的詳細資料。您也可以使用 exec 子系統命令代替 SSIS 子系統命令執行封裝。

關於 SSIS 記錄

SSIS 記錄和記錄提供者可讓您擷取關於封裝執行和失敗的詳細資料。根據預設,封裝不會記錄資訊。您必須設定封裝才能記錄資訊。當您設定封裝以記錄資訊時,會看到類似下列的詳細資訊。在這個情況中,您會知道這是有關權限的問題:

OnError,DOMAINNAME,DOMAINNAME\USERNAME,FTP 工作,{C73DE41C-D0A6-450A-BB94-DF6D913797A1},{2F0AF5AF-2FFD-4928-88EE-1B58EB431D74},4/28/2006 1:51:59 PM,4/28/2006 1:51:59 PM,-1073573489,0x,無法使用 "FTP 連接管理員" 連接 FTP 伺服器。

OnError,DOMAINNAME,DOMAINNAME\USERNAME,執行 SQL 工作,{C6C7286D-57D4-4490-B12D-AC9867AE5762},{F5761A49-F2F9-4575-9E2B-B3D381D6E1F3},4/28/2006 4:07:00 PM,4/28/2006 4:07:00 PM,-1073573396,0x,無法取得連接 "user01.msdb"。連接可能未正確設定,或您沒有這個連接的正確權限。

關於 exec 子系統命令和輸出資訊

利用 exec 子系統命令方法,您會在 SSIS 命令列中加入詳細資訊主控台記錄參數,以呼叫 Dtexec.exe SSIS 命令列執行檔。此外,您會使用輸出檔案的進階作業功能。您也可以使用 [包含步驟輸出於歷程記錄中] 選項,將記錄資訊重新導向至檔案或 SQL Server Agent 作業歷程記錄。

下列是命令列的範例:

dtexec.exe /FILE "C:\_work\SSISPackages\ProtectionLevelTest\ProtectionLevelTest\AgentTesting.dtsx" /MAXCONCURRENT " -1 " /CHECKPOINTING OFF  /REPORTING V  /CONSOLELOG NCOSGXMT


/console 記錄會傳回類似下列的詳細資料:

錯誤:2006-04-27 18:13:34.76 代碼:0xC0202009 來源:AgentTesting 連接管理員 "(local).msdb" 描述:發生 OLE DB 錯誤。錯誤碼: 0x80040E4D。有 OLE DB 記錄可用。來源:"Microsoft SQL Native Client"  Hresult:0x80040E4D  描述:"使用者 'DOMAINNAME\username' 的登入失敗"。錯誤結束


錯誤:2006-04-28 13:51:59.19 代碼:0xC0016016 來源:描述:無法將保護的 XML 節點 "DTS:Property" 解密,錯誤為 0x80070002 "系統找不到指定的檔案"。您可能沒有存取這項資訊的權限。當發生密碼編譯錯誤時,就會發生這個錯誤。請確認有正確的金鑰。錯誤結束


記錄: 名稱:OnError 電腦:COMPUTERNAME 操作員:DOMAINNAME\username 來源名稱:執行 SQL 工作 來源 GUID:{C6C7286D-57D4-4490-B12D-AC9867AE5762} 執行 GUID:{7AFE3D9E-5F73-42F0-86FE-5EFE264119C8} 訊息:無法取得連接 "(local).msdb"。連接可能未正確設定,或您沒有這個連接的正確權限。開始時間:2006-04-27 18:13:34 結束時間:2006-04-27 18:13:34 記錄結束
参考
如需有關類似問題的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
904800嘗試在 SQL Server 2005 中執行 SQL Server 2005 Integration Services 封裝時,收到「錯誤載入」錯誤訊息
如需有關如何在批次作業中使用 Dtutil.exe 公用程式的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
906562如何使用 dtutil 公用程式 (Dtutil.exe) 在 SQL Server 2005 中設定一批 SQL Server Integration Services (SSIS) 封裝的保護等級
如需有關如何建立封裝範本的詳細資訊,請按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:
908018如何在 SQL Server Business Intelligence Development Studio 中建立封裝範本


如需有關 SSIS 封裝安全性和 ProtectionLevel 屬性的詳細資訊,請參閱《SQL Server 2005 線上叢書》中的「Integration Services 的安全性考量」主題。

可惜,使用者沒注意到預設代理程式作業步驟設定會使他們處於這種狀態。如需有關 SQL Server Agent Proxy 和 SSIS 的詳細資訊,請參閱《SQL Server 2005 線上叢書》中的下列主題:
  • 排程 SQL Server Agent 中的封裝執行
  • 建立 SQL Server Agent Proxy
內容

文章識別碼:918760 - 最後檢閱時間:07/16/2013 08:16:00 - 修訂: 2.2

Microsoft SQL Server 2008 Service Pack 1, Microsoft SQL Server 2008 Developer, Microsoft SQL Server 2008 Enterprise, Microsoft SQL Server 2008 Standard, Microsoft SQL Server 2005 Service Pack 3, Microsoft SQL Server 2005 Service Pack 2, Microsoft SQL Server 2005 Developer Edition, Microsoft SQL Server 2005 Enterprise Edition, Microsoft SQL Server 2005 Enterprise Edition for Itanium Based Systems, Microsoft SQL Server 2005 Enterprise X64 Edition, Microsoft SQL Server 2005 Standard Edition, Microsoft SQL Server 2005 Standard X64 Edition, Microsoft SQL Server 2005 Standard Edition for Itanium Based Systems

  • kbsqldeveloper kbprb kbsql2005ssis kbsql2005setup kbexpertiseinter kbexpertiseadvanced kbtshoot KB918760
意見反應