SQL Server 採用角色基礎權限模型,使用者透過角色繼承權限。但當使用者屬於多個角色、或個別權限與角色權限不一致時,會產生權限衝突。本文透過具體情境,詳細解析 DENY (拒絕)、REVOKE (撤銷)、GRANT (授權) 三大操作的優先序與實戰用法。
DE_SALES (銷售部門) 擁有 CUSTOM 表 SELECT 權限SALE1 屬於 DE_SALES,但為試用期員工,不應 查詢 CUSTOM使用者 Landy 屬於角色 SALES (擁有 Customs 表 SELECT),因故需禁止 Landy 存取 Customs。
DENY SELECT ON OBJECT::Customs TO Landy;
SALES 有 SELECT,Landy 仍無法存取若對 public 角色執行 DENY SELECT ON Customs TO public,所有使用者 將無法存取該表 (含 sysadmin)。DENY 應僅用於使用者層級,避免角色/群組層級造成廣泛封鎖。
承上例,Landy 試用期結束,需恢復正常權限 (繼承角色 SALES 的 SELECT)。
REVOKE SELECT ON OBJECT::Customs TO Landy;
Landy 層級的 DENYSALES 的 GRANT,故 Landy 恢復存取| 操作 | 移除目標 | 是否阻擋繼承權限 |
|---|---|---|
| DENY | 在該層級新增拒絕 | 是 (最高優先) |
| REVOKE | 移除該層級的 GRANT/DENY | 否 (繼承權限仍生效) |
DENY 敏感表REVOKE 該 DENY,自動繼承角色權限REVOKE 所有權限或停用登入此模式避免建立額外角色,權限管理更彈性。
若 Landy 同時屬於 SALES (GRANT) 與 T_SALES (DENY Customs):
REVOKE 僅移除使用者層級 DENYT_SALES 的 DENY 仍生效 → Landy 仍無法存取T_SALES 角色層級 REVOKE 或移除使用者該角色同試用期結束場景,改用 GRANT 而非 REVOKE。
GRANT SELECT ON OBJECT::Customs TO Landy;
GRANT:檢查權限時直接看見明確授予,審計較直觀REVOKE:需檢查上層角色權限才知最終結果SELECT * FROM fn_my_permissions(NULL, 'DATABASE') 或第三方工具理解 DENY > GRANT > REVOKE (繼承) 的優先序,善用「角色定基線、使用者做例外」模式,即可靈活解決權限衝突,同時保持權限模型清晰可控。