登錄在 SQL Server 中缺少連接端點權限 - 錯誤 18456,狀態:149
我有一個新的數據庫,我可以通過 SQL Server Management Studio 連接到它並像往常一樣執行操作。我創建了兩個帳戶供我的應用程序使用,並且都可以通過 SSMS 登錄。我的程序正在執行 java 並使用“mssql-jdbc-6.4.0.jre8.jar”驅動程序,當我嘗試連接時,我可以在數據庫日誌中看到以下錯誤:
錯誤:18456,嚴重性:14,狀態:149 使用者“application_read_only_user”登錄失敗。原因:基於登錄的伺服器訪問驗證因基礎結構錯誤而失敗。登錄缺少連接端點權限。
$$ CLIENT: 127.0.0.1 $$
我查看了幾個試圖解決此問題的資源。微軟官方文件似乎沒有列出狀態 149,也沒有我在網上找到的任何結果。
我沒有從原始設置修改我的端點,所以我只有以下項目:
- 專用管理員連接
- TSQL 本地機器
- TSQL 命名管道
- TSQL 預設 TCP
- TSQL 預設 VIA
我嘗試將 SQL Server 服務設置為作為本地系統執行。
這個網站上有很多類似的問題,還有堆棧溢出,但沒有一個能夠提供幫助。它們要麼都有不同的狀態,要麼沒有列出狀態。
我最終設法解決了這個問題。預設情況下,安裝後 TCP/IP 連接已被禁用。我需要打開“SQL Server 配置管理器”,轉到網路配置部分並啟用 TCP/IP。
在 TCP/IP 上的“IP 地址”菜單下,我還需要確保 IP4 選項處於活動狀態,並且 IPAll 埠與我期望的伺服器正在監聽的埠相匹配。
hot2use 的答案有很多可能有用的選項來解決這個問題,但最終他們都無法診斷出我的確切問題。查詢伺服器本身返回的所有結果都表明一切正常,直到我查看此工具後才發現某些設置與我預期的不符。
分析
如果您搜尋錯誤 18456,您最終會找到 Aaron Bertrand 的以下部落格文章:
- 故障排除錯誤 18456(SQL 部落格/Aaron)
其中列出了以下內容
states 146...149
:這些狀態替換了上面的狀態 11 和 12,但僅限於 SQL Server 2016 或更高版本。目標是使系統管理員更容易診斷 SQL auth 和 Windows auth 登錄之間以及連接和端點權限之間的實際潛在問題(所有這些都無需向嘗試登錄的使用者提供任何進一步的資訊)。有關詳細資訊,請參閱本文的後半部分。
上述引用中的這篇文章連結引用了文章“為什麼我會因登錄失敗而出現基礎架構錯誤?” 在CSS SQL Server 工程師部落格/網站上。
文章引用了這兩個可能的原因作為“基於登錄的伺服器訪問驗證失敗並出現基礎架構錯誤”的原因:
- 登錄是否具有此伺服器實例的名為 CONNECT SQL 的 SERVER 類權限?
- 對於客戶端應用程序在其上建立連接的特定端點,登錄是否具有名為 CONNECT 的 ENDPOINT 類權限?
由於 SQL Server 2016+ 具有針對級別 146…149錯誤的新錯誤消息,因此您會看到特定的錯誤消息登錄缺少連接端點權限。(第 149 級),這將引導您進入上面的第二個選項。
使用以下腳本查看您目前的 enpoint 權限:
SELECT * FROM sys.server_permissions AS sp2 JOIN sys.server_principals AS sp ON sp2.grantee_principal_id = sp.principal_id LEFT OUTER JOIN sys.endpoints AS e on sp2.major_id = e.endpoint_id WHERE sp2.permission_name = 'CONNECT' AND sp2.class_desc = 'ENDPOINT'
您應該至少有一個條目用於組合
GRANT
,public
和TSQL Default TCP
解決方案
檢查用於 TCP 的 SQL Server 登錄的 ENDPOINT 上的 CONNECT 權限,或者只是將權限授予該帳戶:
GRANT CONNECT ON ENDPOINT::[TSQL Default TCP] TO public;
(如果您只想將該權限分配給特定帳戶,請替換
public
為您的)<SQL Server Login>
要查看執行的端點列表:
select * from sys.endpoints
進一步閱讀/參考列表
- 故障排除錯誤 18456(SQL 部落格/Aaron)
- 為什麼我會因登錄失敗而收到基礎架構錯誤?(CSS SQL Server 工程師)
- 終結點目錄視圖 (Transact-SQL) (Microsoft Docs)
- GRANT 終結點權限 (Transact-SQL) (Microsoft Docs)