-- 系統權限/角色:使用 ADMIN OPTION
GRANT CREATE SESSION TO emi WITH ADMIN OPTION;
GRANT role1 TO role2 WITH ADMIN OPTION;
-- 物件權限:使用 GRANT OPTION
GRANT SELECT ON customers TO bob WITH GRANT OPTION;
GRANT SELECT ON customers TO hr_manager WITH GRANT OPTION;
場景:管理員授予 User A CREATE SESSION WITH ADMIN OPTION → A 再授予 B CREATE SESSION → 管理員收回 A 的 CREATE SESSION。
CREATE SESSION 權限,不受波及。REVOKE CREATE SESSION FROM B 精準收回 B 的權限。本質:A 獲得「授權他人」的能力,但授權鏈結一旦建立,下游權限獨立存在,不隨上游變動而連動。
場景:管理員授予 User A SELECT ON table WITH GRANT OPTION → A 授予 B SELECT ON table → 管理員收回 A 的 SELECT ON table。
SELECT ON table 同步失效(級聯收回)。REVOKE SELECT ON table FROM B(會報錯),因為 B 的權限來源是 A,非直接授予。本質:權限如樹狀傳播,砍斷根節點(A),枝葉(B)隨之凋零。
| 場景 | 建議選項 | 理由 |
|---|---|---|
| DBA 授權 Junior DBA 管理使用者建立權限 | WITH ADMIN OPTION | 需靈活回收下游權限而不影響其他受授者 |
| 應用擁有者授權開發者查詢特定業務表 | WITH GRANT OPTION | 確保權限隨擁有者收回而自動失效,符合最小權限原則 |
| 角色授予角色 | WITH ADMIN OPTION | 角色屬系統權限範疇,遵循非級聯邏輯 |
-- 系統權限
SELECT * FROM USER_SYS_PRIVS;
SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE = 'USERNAME';
-- 物件權限
SELECT * FROM USER_TAB_PRIVS;
SELECT * FROM DBA_TAB_PRIVS WHERE GRANTEE = 'USERNAME';
-- 角色權限
SELECT * FROM USER_ROLE_PRIVS;
SELECT * FROM ROLE_SYS_PRIVS WHERE ROLE = 'ROLENAME';
掌握 ADMIN OPTION(系統/角色、非級聯) 與 GRANT OPTION(物件、級聯) 的本質差異,是構建清晰、可控、安全權限體系的基石。實務中請嚴格遵循「系統權限用 ADMIN,物件權限用 GRANT」原則,並善用 DBA_* 視圖定期稽核權限鏈結,避免權限蔓延與孤島。