Sql-Server

登錄在 SQL Server 中缺少連接端點權限 - 錯誤 18456,狀態:149

  • October 2, 2019

我有一個新的數據庫,我可以通過 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 的以下部落格文章:

其中列出了以下內容states 146...149

這些狀態替換了上面的狀態 11 和 12,但僅限於 SQL Server 2016 或更高版本。目標是使系統管理員更容易診斷 SQL auth 和 Windows auth 登錄之間以及連接和端點權限之間的實際潛在問題(所有這些都無需向嘗試登錄的使用者提供任何進一步的資訊)。有關詳細資訊,請參閱本文的後半部分。

上述引用中的這篇文章連結引用了文章“為什麼我會因登錄失敗而出現基礎架構錯誤?”CSS SQL Server 工程師部落格/網站上。

文章引用了這兩個可能的原因作為“基於登錄的伺服器訪問驗證失敗並出現基礎架構錯誤”的原因:

  1. 登錄是否具有此伺服器實例的名為 CONNECT SQL 的 SERVER 類權限?
  2. 對於客戶端應用程序在其上建立連接的特定端點,登錄是否具有名為 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,publicTSQL Default TCP

解決方案

檢查用於 TCP 的 SQL Server 登錄的 ENDPOINT 上的 CONNECT 權限,或者只是將權限授予該帳戶:

GRANT CONNECT ON ENDPOINT::[TSQL Default TCP] TO public;

(如果您只想將該權限分配給特定帳戶,請替換public為您的)<SQL Server Login>

要查看執行的端點列表:

select * from sys.endpoints

進一步閱讀/參考列表

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