當針對同一目標數據庫發生同時操作時,SSIS 包命中“使用者登錄失敗”
快速總結
我們一直致力於將我們的 SSIS 包庫從託管在物理 Windows Server 2003 上的 SQL Server 2008 遷移到託管在虛擬 Windows Server 2012 上的 SQL Server 2012。我們使用項目部署將新包部署到集成服務目錄。這些包將數據導入到單獨伺服器/實例上的另一個 SQL Server 2012 數據庫中。
當包試圖對同一個 SQL Server 2012 目標數據庫同時執行多個 SQL 操作時,我們似乎收到“登錄失敗”錯誤。
環境快速比較
舊(它工作的地方)
- 目標數據庫是物理 Windows Server 2003 上的 SQL Server 2008。
- 從 Windows Server 2003 上的文件系統執行的 SSIS 2008 包;從機器環境變數接收參數。
新(我們有時會收到錯誤)
- 目標數據庫是虛擬 Windows Server 2012 上的 SQL Server 2012。
- 從單獨伺服器上的 SQL 2012 集成服務目錄執行的 SSIS 2012 包:也是虛擬 Windows Server 2012。
錯誤
新環境下某些包出現異常錯誤:
DTS_E_OLEDBERROR An OLEDB error has occurred Error code: 0x80040E4D An OLEDB record is available. Source: "Microsoft SQL Server Native Client 11.0" HResult: 0x80040E4D Description: "Login failed for user 'MyUser'"
在目標數據庫 SQL 日誌中,我們有以下條目:
Source: Logon, Message: Login failed for user 'MyUser'. Reason: Password did not match that for the login provided. [CLIENT: {IP addr. for SSIS DB server}]
雖然這看起來很簡單,但它並不能說明整個故事。
我們所知道的
首先,我們仔細檢查了 SSIS 包中的數據庫連接字元串。這些包具有數據庫連接管理器,其連接屬性綁定到項目參數,而項目參數又綁定到集成服務目錄中的環境變數。
我們驗證了這些包是使用正確的環境執行的。
此外,使用相同連接管理器的 SQL 操作工作正常,導致錯誤!
所有錯誤的共同因素似乎是,當使用同一個數據庫連接管理器同時發生多個 SQL 操作時,我們會收到此“登錄失敗”錯誤。
當我們重構包的失敗部分以一次而不是同時執行一個數據庫操作時,錯誤就會消失。
但它在我們的舊環境中工作……
這些包在面向 SQL Server 2008 數據庫的 SSIS 2008 中執行良好,在物理 Windows Server 2003 伺服器上執行。
…當我們從 Visual Studio 2012 執行包時它仍然有效
當我們從 Visual Studio 對同一目標數據庫(虛擬 Windows Server 2012 上的 SQL 2012)執行新的 SSIS 2012 包時,我們不會遇到錯誤。
這使我們相信這與它們在集成服務目錄中的部署和執行方式有關,但我們無法找出問題所在。這是我們可以使用一些幫助的地方。
這裡是:有問題的失敗登錄是 SQL Server 登錄。以下是我們為舊環境、新環境和開發人員環境配置 SQL 連接管理器屬性的方式:
ServerName
-MyServer
InitialCatalog
-MyDB
UserName
-MyUser
Password
-***********
ConnectionString
-Data Source=MyServer;User Id=MyUser;Initial Catalog=MyDB;Provider=SQLNCLI11;Persist Security Info=True;Auto Translate=False;
雖然這在舊的 SQL 2008 環境中執行良好,並且在 Visual Studio 中沒有問題,但在 SQL 2012 集成服務目錄的同時數據庫操作期間它失敗了,但在我們添加
Password=******
到連接字元串時開始工作。
ConnectionString
-Data Source=MyServer;User Id=MyUser;Password=********;Initial Catalog=MyDB;Provider=SQLNCLI11;Persist Security Info=True;Auto Translate=False;
似乎如果在 SQL 2012 集成服務目錄執行環境中打開第二個同時連接,則僅查詢連接字元串本身(初始連接的?),而不是
Password
連接管理器的其他組成屬性。因此,Password
必須在連接字元串中。
它確實有效,但只有一次,因為即使使用 Persist Security Info=True; 它也不會保存密碼;我最終使用 Windows 使用者帳戶進行連接,並將包安全性切換為依賴 SQL Server 角色,並且它起作用了。