一數據庫服務器(SQL Server 2014)上的一個作業執行報錯,具體錯誤信息如下:
Executed as user: NT SERVICE\SQLSERVERAGENT. 用戶 'xxxx\xxxxx$' 登錄失敗。 [SQLSTATE 28000] (Error 18456). The step failed.
其中用戶 'xxxx\xxxxx$',反斜杠前面是域名,后面為計算機名稱+$, 其實這是一個虛擬賬號。 即本地系統帳戶不具有網絡的任何訪問權限。當需要訪問網絡時,本地系統使用帳戶 Domain\computername$ 。具體參考關於 Configuration Manager 中的本地系統帳戶/Computer$。
起初看到這個錯誤,有點不知所以然,並不清楚是什么具體原因造成,那么就去檢查作業執行的存儲過程,發現里面使用鏈接服務器(LINKED SERVER),由於這個錯誤提示是本地系統賬號訪問網絡的權限問題,所以我特意去鏈接服務器(LINKED SERVER)所指向的數據庫服務器,結果在同一時間點也出現了一個錯誤信息,其實就是該作業鏈接過來時產生的信息。
Message
Login failed for user 'xxx\xxxx$'. 原因: 基於令牌的服務器訪問驗證失敗,出現基礎結構錯誤。請檢查以前的錯誤。 [客戶端: 192.168.xxx.xxx]
檢查該鏈接服務器(LINKED SERVER)發現該鏈接服務器使用的是“使用登錄名的當前安全上下文建立連接”(Be made using the login's current security context)
由於是作業調用該存儲過程,那么該作業執行到調用鏈接服務器部分SQL時,使用的就是啟動SQL Agent服務的登錄名來建立安全上下文, 如下所示,SQL Agent服務的啟動賬號為NT Service\SQLSERVERAGENT, 而鏈接服務器(LINKED SERVER)所指的數據庫服務器,啟動SQL Agent服務的登錄名為一個域賬號,很顯然此時鏈接服務器就會遇到權限問題。其實就是最近修改了這台服務器的SQL Agent服務的登錄名所導致。SQL Agent服務本來是一個域賬號啟動的。
知道具體原因了,那么就能給出具體解決方案了:
方法1: 修改啟動SQL Server Agent服務的登錄名,例如具有系統管理員權限的域賬號(當然所指向的服務器也具有該域賬號,並且有相關權限),然后重啟SQL Agent服務就能解決問題。
方法2: 修改鏈接服務器(LINKED SERVER),使用特定賬號來建立安全上下文機制也可以解決這個問題。