一資料庫伺服器(SQL Server 2014)上的一個作業執行報錯,具體錯誤信息如下: Executed as user: NT SERVICE\SQLSERVERAGENT. 用戶 'xxxx\xxxxx$' 登錄失敗。 [SQLSTATE 28000] (Error 18456). The s... ...
一資料庫伺服器(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),使用特定賬號來建立安全上下文機制也可以解決這個問題。