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

Oracle 自主存取控制 (DAC) 系統表深度解析:SYSAUTH$、OBJAUTH$、權限模型與遞迴查詢

     編輯:Oracle 資料庫基礎

權限模型概覽

Oracle DAC 基於 存取控制列表 (ACL) 實現,核心區分兩類權限:

  • 系統權限:跨物件、管理型權限。如 CREATE TABLE、ALTER SYSTEM、SELECT ANY TABLE。
  • 物件權限:針對特定物件。如 SELECT ON scott.emp、EXECUTE ON pkg_util。

系統權限儲存:SYS.SYSAUTH$


CREATE TABLE "SYS"."SYSAUTH$" (
  "GRANTEE#" NUMBER NOT NULL,   -- 被授權者 USER#/ROLE#
  "PRIVILEGE#" NUMBER NOT NULL, -- 權限代碼(負數=系統權限,正數=角色 ID)
  "SEQUENCE#" NUMBER NOT NULL,  -- 授權序號(時間戳概念)
  "OPTION$" NUMBER              -- 是否可轉授 (ADMIN OPTION)
) TABLESPACE "SYSTEM";

關鍵特性

  • 不記錄授權者:無 GRANTOR# 欄位,故系統權限無級聯回收機制,回收由具備 ADMIN OPTION 或 DBA 直接執行。
  • 角色與系統權限共存:PRIVILEGE# > 0 表角色授予,< 0 表系統權限。
  • 遞迴查詢取得使用者完整權限:需走角色層級遞迴。

遞迴查詢範例:取得使用者所有系統權限


WITH RECURSIVE priv_tree(grantee#, privilege#, option$) AS (
  -- 基礎:直接授予使用者的系統權限
  SELECT grantee#, privilege#, option$
  FROM sys.sysauth$
  WHERE grantee# = (SELECT user# FROM sys.user$ WHERE name = 'SCOTT')
    AND privilege# < 0
  UNION ALL
  -- 遞迴:角色轉授的系統權限
  SELECT sa.grantee#, sa.privilege#, sa.option$
  FROM sys.sysauth$ sa
  JOIN priv_tree pt ON sa.grantee# = pt.privilege#  -- 角色 ID = 權限代碼
  WHERE sa.privilege# < 0
)
SELECT DISTINCT p.name AS privilege_name
FROM priv_tree pt
JOIN system_privilege_map p ON p.privilege = -pt.privilege#;

物件權限儲存:SYS.OBJAUTH$


CREATE TABLE "SYS"."OBJAUTH$" (
  "OBJ#" NUMBER NOT NULL,        -- 物件 ID
  "GRANTOR#" NUMBER NOT NULL,    -- 授權者 USER#
  "GRANTEE#" NUMBER NOT NULL,    -- 被授權者 USER#/ROLE#
  "PRIVILEGE#" NUMBER NOT NULL,  -- 權限代碼(正數對應 table_privilege_map)
  "SEQUENCE#" NUMBER NOT NULL,   -- 授權序號
  "PARENT" ROWID,                -- 父授權記錄 ROWID(級聯回收用)
  "OPTION$" NUMBER,              -- GRANT OPTION
  "COL#" NUMBER                  -- 欄位層級授權時的欄位號(表級為 0)
) TABLESPACE "SYSTEM";

關鍵特性

  • 記錄授權者:支援級聯回收(CASCADE),透過 PARENT 串聯。
  • 欄位層級授權:COL# > 0 表示針對特定欄位(如 GRANT SELECT(sal) ON emp TO hr)。
  • 轉授追蹤:OPTION$ = 1 表示可轉授,回收時需檢查下游授權。

常用視圖與查詢

視圖用途
DBA_SYS_PRIVS使用者/角色直接系統權限
DBA_TAB_PRIVS物件權限(含轉授鏈)
DBA_ROLE_PRIVS角色授予關係
ROLE_SYS_PRIVS / ROLE_TAB_PRIVS角色擁有的權限
SESSION_PRIVS當前 Session 擁有的系統權限

實務操作建議

  1. 授權採用 角色為主、直接授權為輔,降低維護複雜度。
  2. 定期稽核 DBA_TAB_PRIVS 中 GRANTOR != 'SYS' 的記錄,排查非預期轉授。
  3. 回收物件權限建議加 CASCADE CONSTRAINTS,自動處理依賴約束。
  4. 12c+ 引入 PDB 區域權限,注意 CONTAINER=ALL/CURRENT 子句。

系統表直接操作風險警示

嚴禁直接 DML 修改 SYSAUTH$、OBJAUTH$。所有權限變更必須透過 GRANT/REVOKE 指令,確保字典一致性、審計記錄、共用游標失效等機制正常運作。

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