Sql-Server

當使用者使用 FreeTDS 登錄時,SSIS 包執行失敗

  • February 27, 2020

我試圖讓登錄通過內置的 SSISDB 儲存過程而不是通過 SQL 代理來啟動 SSIS 包。

登錄將通過 Ubuntu 機器上的 Airflow DAG 進行連接,因此我們使用 FreeTDS / pyodbc 允許它作為 Windows 登錄進行身份驗證,這工作正常。

但是,啟動包時會發生以下情況:

  1. 使用[SSISDB].[catalog].[start_execution] @execution_id. 嘗試同步和非同步執行。
  2. 生成一個執行 ID,以及[SSISDB].[catalog].[executions]一個狀態為 5(“待定”)的條目
  3. 約 1 分鐘後,執行“完成”並且執行 ID 從所有 SSISDB 表中擦除,並且不會顯示在任何內置報告中。

即使添加 exec 參數來創建轉儲文件,在包執行期間也不會創建任何內容。

**額外問題:**在大約 1 分鐘的時間範圍內,從 SQL 代理啟動的其他通常可以正常工作的包通常會失敗並顯示以下錯誤消息:

由於執行超時,操作失敗。

筆記:

  • SQL Server 安裝在 Windows 上,並且是 SQL Server 2016 Ent。
  • 從 Windows 框使用我的 Windows 身份驗證登錄時,此過程可以正常工作。
  • DAG 使用的 Windows 帳戶是代理服務帳戶,因此具有所有必要的權限。
  • 掛起執行的兩個 SID 欄位[SSISDB].[catalog].[executions]與 SQL 代理為同一服務帳戶處理的其他工作執行的 SID 匹配。
  • 我們正在使用 TDS 版本 7.2 和最新的 FreeTDS 版本。
  • 使用自動送出 True/False 時沒有區別
  • 執行期間沒有看到阻塞

我猜登錄在用於啟動外部 SSIS 程序時會被重新驗證,但我希望可能有一些方法可以使這項工作仍然有效。

由於增加了複雜性和安全隱患,通過 CLR 呼叫是不受歡迎的選擇。

我目前也在測試通過 dtexec 通過 xp_cmdshell 啟動它們(看起來很有希望),但我不清楚這將如何/為什麼會起作用,而使用儲存過程則不會。

SSIS 目錄執行模擬連接的登錄,因此可能更正它是一個身份驗證問題。簡單的解決方法是為要執行包的身份提供 SQL代理代理,並配置代理作業以執行包,使用sp_start_job呼叫該作業。

這與使用 xp_cmdshell 直接執行 dtexec 或從 powershell 呼叫包執行過程類似,但更安全。在這兩種情況下,本地身份都用於執行包。

引用自:https://dba.stackexchange.com/questions/260665