查詢使用者對物件權限的核心視圖為 `DBA_TAB_PRIVS`。本文詳細解析其欄位含義、GRANT/REVOKE 語法對應關係,並提供 15 個相關權限視圖的分類對照表,助你快速定位所需權限資訊。
核心視圖:DBA_TAB_PRIVS 結構
| 欄位名 | 型別 | Null? | 說明 |
| GRANTEE | VARCHAR2(30) | NOT NULL | 權限獲得者 (使用者/角色) |
| OWNER | VARCHAR2(30) | NOT NULL | 物件擁有者 |
| TABLE_NAME | VARCHAR2(30) | NOT NULL | 物件名稱 (表/視圖/序列/程序等) |
| GRANTOR | VARCHAR2(30) | NOT NULL | 權限授予者 |
| PRIVILEGE | VARCHAR2(40) | NOT NULL | 權限類型 (SELECT, INSERT, UPDATE, DELETE, REFERENCES, EXECUTE 等) |
| GRANTABLE | VARCHAR2(3) | | YES/NO:獲得者是否可將此權限再授予他人 (WITH GRANT OPTION) |
權限授予/收回語法對應
-- 授予
GRANT SELECT, INSERT, UPDATE, DELETE, REFERENCES ON my_table TO user_joe;
GRANT CREATE PUBLIC SYNONYM TO user_joe; -- 系統權限
-- 收回
REVOKE INSERT, DELETE ON my_table FROM user_joe;
15 大權限相關數據字典分類對照
| 視圖名稱 | 範圍 | 用途 | 關鍵差異 |
| DBA_TAB_PRIVS | 全資料庫 | 所有物件權限 | DBA 權限查看 |
| ALL_TAB_PRIVS | 可存取 | 當前使用者可存取的物件權限 | 含自身擁有+被授予 |
| ALL_TAB_PRIVS_MADE | 可存取 | 當前使用者**授予他人**的物件權限 | GRANTOR = 當前用戶 |
| ALL_TAB_PRIVS_RECD | 可存取 | 當前使用者**從他人獲得**的物件權限 | GRANTEE = 當前用戶 |
| USER_TAB_PRIVS | 自身 | 當前使用者擁有物件的權限 | OWNER = 當前用戶 |
| USER_TAB_PRIVS_MADE | 自身 | 當前使用者授予他人的權限 | |
| USER_TAB_PRIVS_RECD | 自身 | 當前使用者獲得的權限 | |
| DBA_SYS_PRIVS | 全資料庫 | 所有系統權限 (CREATE TABLE, ALTER SYSTEM 等) | |
| USER_SYS_PRIVS | 自身 | 當前使用者的系統權限 | |
| DBA_ROLE_PRIVS | 全資料庫 | 所有角色授予關係 (GRANTED_ROLE, GRANTEE) | |
| USER_ROLE_PRIVS | 自身 | 當前使用者擁有的角色 | |
| ROLE_ROLE_PRIVS | 角色 | 角色被授予的角色 (角色嵌套) | |
| ROLE_SYS_PRIVS | 角色 | 角色擁有的系統權限 | |
| ROLE_TAB_PRIVS | 角色 | 角色擁有的物件權限 | |
| SESSION_PRIVS | 會話 | 當前會話啟用的系統權限 (含角色繼承) | 即時生效權限 |
| SESSION_ROLES | 會話 | 當前會話啟用的角色 | 即時生效角色 |
實務查詢範例
1. 查詢特定用戶所有物件權限
SELECT * FROM DBA_TAB_PRIVS WHERE GRANTEE = 'SCOTT';
2. 查詢特定表誰有 SELECT 權限
SELECT GRANTEE, GRANTOR, GRANTABLE
FROM DBA_TAB_PRIVS
WHERE TABLE_NAME = 'EMP' AND OWNER = 'SCOTT' AND PRIVILEGE = 'SELECT';
3. 檢查當前會話實際擁有權限 (含角色繼承)
SELECT * FROM SESSION_PRIVS;
SELECT * FROM SESSION_ROLES;
4. 角色權限完整鏈路追蹤
-- 角色 -> 系統權限
SELECT * FROM ROLE_SYS_PRIVS WHERE ROLE = 'DBA';
-- 角色 -> 物件權限
SELECT * FROM ROLE_TAB_PRIVS WHERE ROLE = 'RESOURCE';
-- 角色 -> 角色
SELECT * FROM ROLE_ROLE_PRIVS WHERE ROLE = 'DBA';
最佳實務建議
- 原則使用 **角色** 管理權限,避免直接授予使用者物件權限
- 定期審計 `DBA_TAB_PRIVS` / `DBA_SYS_PRIVS`,清理過期/過度授權
- 應用程式連線帳號**僅授予必要物件權限**,嚴禁使用 DBA/RESOURCE 等高權限角色
- 利用 `SESSION_PRIVS`/`SESSION_ROLES` 於應用啟動時驗證權限完整性