Oracle 權限體系分為「系統權限」 (資料庫級操作) 與「物件權限」 (特定物件操作),兩者授權語法的關鍵字不同:系統權限用 WITH ADMIN OPTION,物件權限用 WITH GRANT OPTION。角色權限則介於兩者之間,且受限於定義者權限程式單元。本文深度釐清三者差異、授權/回收語法、角色在 PL/SQL 中的失效機制,並提供標準授權範本。
| 項目 | 系統權限 | 物件權限 |
|---|---|---|
| 範例 | CREATE TABLE, CREATE USER, ALTER SYSTEM | SELECT ON emp, EXECUTE ON pkg |
| 授權關鍵字 | WITH ADMIN OPTION | WITH GRANT OPTION |
| 錯誤示範 | GRANT CREATE TABLE TO u WITH GRANT OPTION → ORA-01931 | GRANT SELECT ON emp TO u WITH ADMIN OPTION → ORA-01749 |
| 傳遞效力 | 可再授權系統權限/角色、可回收、可修改/刪除角色 | 可再授權物件權限、可建 View 並授權 |
| 查詢視圖 | DBA_SYS_PRIVS, ROLE_SYS_PRIVS | DBA_TAB_PRIVS, ROLE_TAB_PRIVS |
SET ROLE 切換。CREATE ROLE r IDENTIFIED BY pwd 需密碼才能啟用。
GRANT CREATE TABLE, CREATE SESSION TO app_role WITH ADMIN OPTION;
定義者權限程式單元 (Definer's Rights,預設) 執行時,角色停用,僅生效直接授予擁有者的權限。
場景:User A 有 SELECT ANY TABLE (透過角色獲得)。A 建立 Procedure p 查詢其他 Schema 表。User B 執行 A.p 會報 ORA-00942 (表不存在),因角色在 Definer's Rights 中不生效。
GRANT SELECT ON other_schema.tbl TO A; (最推薦)。CREATE OR REPLACE PROCEDURE p AUTHID CURRENT_USER IS ... (12c+ 預設可設定)。DBMS_SESSION.SET_ROLE 啟用。
GRANT role_name | sys_priv
TO user | role | PUBLIC
[WITH ADMIN OPTION];
GRANT obj_priv [(columns)]
ON object_name
TO user | role | PUBLIC
[WITH GRANT OPTION];
REVOKE role_name | sys_priv FROM user | role;
REVOKE obj_priv ON object_name FROM user | role;
-- 物件權限回收會級聯 (CASCADE) 刪除依賴該權限的轉授權
WITH ADMIN/GRANT OPTION 是否對應正確權限類型。APP_DDL (CREATE TABLE/VIEW/SEQUENCE...)APP_READ, APP_WRITE, APP_EXECUTEAPP_ADMIN (含 ADMIN OPTION)SELECT ANY TABLE 等 ANY 權限:改用細粒度物件權限或 VPD/OLS。AUDIT GRANT ANY PRIVILEGE, GRANT ANY ROLE, CREATE ROLE, ALTER ROLE BY ACCESS;
-- 某角色擁有的系統權限
SELECT privilege FROM role_sys_privs WHERE role = 'APP_READ';
-- 某角色擁有的物件權限
SELECT owner, table_name, privilege FROM role_tab_privs WHERE role = 'APP_READ';
-- 使用者生效權限 (含角色間接權限)
SELECT * FROM USER_SYS_PRIVS;
SELECT * FROM USER_TAB_PRIVS;
SELECT * FROM USER_ROLE_PRIVS;
搞清 ADMIN OPTION (系統/角色) 與 GRANT OPTION (物件) 的分野,理解角色在 Definer's Rights 中的失效機制,是設計安全、可維運 Oracle 權限模型的核心關鍵。