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

Oracle 系統權限與角色權限深度解析:ADMIN vs GRANT OPTION 關鍵差異

     編輯:Oracle 資料庫基礎

Oracle 權限體系分為「系統權限」 (資料庫級操作) 與「物件權限」 (特定物件操作),兩者授權語法的關鍵字不同:系統權限用 WITH ADMIN OPTION,物件權限用 WITH GRANT OPTION。角色權限則介於兩者之間,且受限於定義者權限程式單元。本文深度釐清三者差異、授權/回收語法、角色在 PL/SQL 中的失效機制,並提供標準授權範本。

系統權限 vs 物件權限:授權語法核心差異

項目系統權限物件權限
範例CREATE TABLE, CREATE USER, ALTER SYSTEMSELECT ON emp, EXECUTE ON pkg
授權關鍵字WITH ADMIN OPTIONWITH GRANT OPTION
錯誤示範GRANT CREATE TABLE TO u WITH GRANT OPTION → ORA-01931GRANT SELECT ON emp TO u WITH ADMIN OPTION → ORA-01749
傳遞效力可再授權系統權限/角色、可回收、可修改/刪除角色可再授權物件權限、可建 View 並授權
查詢視圖DBA_SYS_PRIVS, ROLE_SYS_PRIVSDBA_TAB_PRIVS, ROLE_TAB_PRIVS

角色與角色權限

角色本質

  • 權限的容器:將相關系統/物件權限打包成角色,再授予使用者。
  • 動態啟用:使用者登入時預設角色自動啟用,Session 中可用 SET ROLE 切換。
  • 密碼保護:CREATE ROLE r IDENTIFIED BY pwd 需密碼才能啟用。

角色授權系統權限語法


GRANT CREATE TABLE, CREATE SESSION TO app_role WITH ADMIN OPTION;

角色在 PL/SQL 中的限制 (關鍵!)

定義者權限程式單元 (Definer's Rights,預設) 執行時,角色停用,僅生效直接授予擁有者的權限。

場景:User A 有 SELECT ANY TABLE (透過角色獲得)。A 建立 Procedure p 查詢其他 Schema 表。User B 執行 A.p 會報 ORA-00942 (表不存在),因角色在 Definer's Rights 中不生效。

解決方案

  1. 直接授予物件權限給擁有者: GRANT SELECT ON other_schema.tbl TO A; (最推薦)。
  2. 改用呼叫者權限: CREATE OR REPLACE PROCEDURE p AUTHID CURRENT_USER IS ... (12c+ 預設可設定)。
  3. 安全應用程式角色: 以 PL/SQL 包驗證後 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) 刪除依賴該權限的轉授權

實務最佳實踐

  1. 嚴禁混用關鍵字:代碼審查必須檢查 WITH ADMIN/GRANT OPTION 是否對應正確權限類型。
  2. 角色設計原則:
    • 系統權限角色:APP_DDL (CREATE TABLE/VIEW/SEQUENCE...)
    • 物件權限角色:APP_READ, APP_WRITE, APP_EXECUTE
    • 管理角色:APP_ADMIN (含 ADMIN OPTION)
  3. 避免 SELECT ANY TABLE 等 ANY 權限:改用細粒度物件權限或 VPD/OLS。
  4. 稽核關鍵授權: AUDIT GRANT ANY PRIVILEGE, GRANT ANY ROLE, CREATE ROLE, ALTER ROLE BY ACCESS;
  5. 文檔化:維護權限矩陣表 (角色 × 系統權限/物件權限),納入變更管理流程。

快速查詢腳本


-- 某角色擁有的系統權限
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 權限模型的核心關鍵。

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