首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 權限錯誤排解指南:SELECT 權限被拒絕、SA 登入失敗與信任連線問題

     編輯:關於SqlServer

前言

權限問題是 SQL Server 開發運維中最常見的阻礙。本文針對兩大經典錯誤:「SELECT 權限被拒絕」 與 「SA 登入失敗:不與信任 SQL Server 連線相關聯」,提供根因分析、解決步驟與預防原則。

一、錯誤 1:拒絕對物件 'data' 的 SELECT 權限

錯誤訊息


拒絕了對對象 'data' (資料庫 'xxx', 所有者 'dbo') 的 SELECT 權限

根因:db_denydatareader 角色優先級最高

  • 使用者被加入 db_denydatareader 固定資料庫角色。
  • DENY 優先於 GRANT:即使同時擁有 db_datareader 或物件層級 GRANT SELECT,DENY 仍會生效封鎖存取。
  • 常見誤區:初學者認為「勾選越多角色權限越大」,錯把 db_denydatareader 當成「資料讀取者」而勾選。

解決步驟 (SSMS 圖形化)

  1. 展開 資料庫 → 安全性 → 使用者,右鍵目標使用者 → 屬性。
  2. 切換 成員資格 頁籤。
  3. 取消勾選 db_denydatareader。
  4. 確定儲存。

T-SQL 解決


USE [YourDatabase];
GO
ALTER ROLE db_denydatareader DROP MEMBER [YourUser];
-- 或舊版相容
EXEC sp_droprolemember 'db_denydatareader', 'YourUser';
GO

權限層級優先序 (高→低)

  1. DENY (資料庫/結構描述/物件層級)
  2. GRANT (物件層級)
  3. GRANT (結構描述層級)
  4. GRANT (資料庫層級,如 db_datareader)
  5. PUBLIC 隱性權限

最佳實務:避免使用 db_denydatareader/db_denydatawriter。採用「最小權限原則」:僅 GRANT 必需物件權限,不授予多餘角色。

二、錯誤 2:使用者 'sa' 登入失敗,不與信任 SQL Server 連線相關聯

錯誤訊息


用戶 'sa' 登錄失敗。該用戶與可信 SQL Server 連接無關聯。

根因:伺服器驗證模式為「僅 Windows 驗證」

  • SQL Server 安裝預設為 Windows 驗證模式。
  • 此模式下,停用 SQL Server 驗證,所有 SQL 登入 (含 sa) 皆無法連線。
  • 錯誤訊息「不與信任連線相關聯」意指:連線嘗試使用 SQL 驗證,但伺服器只接受 Windows 整合驗證 (信任連線)。

解決步驟 (需以 Windows 管理員身分登入)

  1. 使用 Windows 驗證 連線 SSMS (需為本機管理員或 sysadmin 角色)。
  2. 右鍵伺服器節點 → 屬性 → 安全性 頁籤。
  3. 伺服器驗證 區域,選擇 SQL Server 和 Windows 驗證模式 (混合模式)。
  4. 點擊 確定,SSMS 提示需重新啟動服務。
  5. 在 物件總管 → 管理 → SQL Server 服務 中,右鍵 SQL Server (MSSQLSERVER) → 重新啟動。

T-SQL 替代方案 (進階,需啟用 xp_cmdshell)


EXEC xp_instance_regwrite N'HKEY_LOCAL_MACHINE',
    N'Software\Microsoft\MSSQLServer\MSSQLServer',
    N'LoginMode', REG_DWORD, 2;  -- 2 = 混合模式
-- 之後仍需重啟服務

補充:sa 帳戶本身被停用

若混合模式已啟用但仍失敗,檢查 sa 是否啟用:

  1. SSMS → 安全性 → 登入 → sa → 右鍵屬性 → 狀態 頁籤。
  2. 確認 登入 區域選擇 已啟用。
  3. 若密碼遺失,可在屬性 → 一般 頁籤重設密碼 (需 sysadmin 權限)。

三、預防與稽核建議

面向 建議
安裝標準化 安裝腳本/組態管理 (DSC/Ansible) 強制設定混合模式、強制 sa 強密碼、停用 sa 或改名。
權限模型 建立應用程式專用登入/使用者,授予結構描述級 GRANT,拒絕直接使用 sa/系統管理員帳號連線應用。
定期稽核 查詢 sys.database_role_members 找出異常 db_denydatareader 成員;查詢 sys.server_principals 檢查 SQL 登入狀態。
錯誤訊息國際化 錯誤訊息可能為中文/英文/其他語言,依 @@LANGUAGE 而定,排查時以錯誤號 (18452, 229) 為準。

結語

權限問題本質上是「最小權限原則」執行不到位。db_denydatareader 是反模式陷阱;混合模式未啟用是安裝預設值陷阱。建立標準化安裝檢查清單、權限矩陣文件、定期權限稽核腳本,能從根源消除此類事故。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved