通过权限分析查找未使用的权限
Oracle安全命令
-- 1) Capture privilege usage for a specific user:
BEGIN
DBMS_PRIVILEGE_CAPTURE.CREATE_CAPTURE(
name => 'CAP_APP_USER',
description => 'Actual privilege usage of the application user',
type => DBMS_PRIVILEGE_CAPTURE.G_CONTEXT,
condition => 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') = ''CUSTOMER_APP''');
DBMS_PRIVILEGE_CAPTURE.ENABLE_CAPTURE(name => 'CAP_APP_USER', run_name => 'RUN_2026_10');
END;
/
-- Other types: G_DATABASE (whole DB), G_ROLE (roles => role_name_list('DBA')), G_ROLE_AND_CONTEXT
-- 2) After a representative workload (including month end), stop and generate results:
BEGIN
DBMS_PRIVILEGE_CAPTURE.DISABLE_CAPTURE(name => 'CAP_APP_USER');
DBMS_PRIVILEGE_CAPTURE.GENERATE_RESULT(name => 'CAP_APP_USER', run_name => 'RUN_2026_10');
END;
/
-- 3) Used and never-used privileges:
SELECT username, sys_priv, obj_priv, object_owner, object_name, used_role
FROM dba_used_privs WHERE capture = 'CAP_APP_USER';
SELECT username, sys_priv, obj_priv, object_owner, object_name
FROM dba_unused_privs WHERE capture = 'CAP_APP_USER';
-- 4) Through which role chain was the privilege used?
SELECT username, sys_priv, used_role, path
FROM dba_used_sysprivs_path WHERE capture = 'CAP_APP_USER';
-- 5) Cleanup:
EXEC DBMS_PRIVILEGE_CAPTURE.DROP_CAPTURE(name => 'CAP_APP_USER');作用
权限分析在运行时记录所选范围(整个数据库、角色、条件)内实际使用了哪些系统/对象权限;结果列出未使用的权限,以便按最小权限原则规划 REVOKE。
适用场景
用于清理拥有 DBA/ANY 权限的应用账户、审计前的权限审查,以及弄清套装应用真正需要什么。
注意
自 2018 年起包含在 Enterprise Edition 中(之前需要 Database Vault 许可);无需额外许可。捕获期间有少量开销。结果只反映捕获窗口内的负载:如果月末、年末或应急作业没有运行,显示为"未使用"的权限可能仍然需要,因此请逐步回收。同一时间只能启用一个捕获;唯一的例外是 G_DATABASE 捕获可以与一个角色或上下文捕获同时启用。