如何使用代理通過 T-SQL 從 SQL 代理呼叫 SSIS 包
建構一個包含許多包和一個“控製文件”表的 ETL 框架,以正確的順序編排執行它們並管理錯誤。為了控制數據載入的整體操作,我想這樣做:
- 在 SQL 代理中創建作業
- 在作業步驟中呼叫自定義儲存過程
- 在儲存過程中,呼叫 SSISDB.catalog.create_execution 和相關的procs來執行一個包
- 出於安全原因,在不是系統管理員且不是 SQL 代理服務帳戶的專用 ETL Windows 使用者帳戶下執行此操作。
步驟 1、2 和 3 中的所有內容都有效,但如果我嘗試將代理作業步驟配置為作為另一個帳戶或代理執行,則它不起作用。
背景
從具有作業步驟類型“集成服務”的代理作業執行單個包是可行的,因為有一個選項可以將步驟設置為以代理使用者身份執行。(新作業 > 步驟 > 新步驟 > 類型 = 集成服務 > RUN AS)。問題是我們需要“包裝器”邏輯來控制所有這些單獨的包。
從 T-SQL 直接從儲存過程執行包是可行的。
在代理中的 T-SQL 作業 STEP 中從儲存過程執行包,如果該作業由系統管理員擁有,則可以工作,*但它作為 SQL Server 代理服務帳戶執行,*這是一個安全問題。
在代理中的 T-SQL 作業步驟中從儲存過程執行包,如果作業由非系統管理員使用者擁有,則由於代理的 EXECUTE AS 程式碼中的問題而失敗,其中 SSIS 過程拋出類似“不能revert’ - 這讓我相信代理的 EXECUTE AS 邏輯存在問題,該邏輯在作業所有者帳戶下執行 T-SQL,然後呼叫 SSIS 程序。我在網上找到了一些資訊,希望可以重新找到連結。
從 T-SQL 代理作業步驟執行包沒有 RUN AS 功能來設置程式碼以在代理帳戶下執行。這是一個連接項目:-)。
從 T-SQL 代理作業執行包,我在作業步驟程式碼中手動放入 EXECUTE AS 邏輯也不起作用。
樹樁?
我最終在 SQL 代理中使用了一個 PowerShell 步驟來解決這個問題:作業步驟類型“PowerShell”和一個簡短的腳本,它使用 Invoke-Sqlcmd 來呼叫儲存過程。感覺很尷尬,但它可以在備用憑據下工作。