普通用户执行DBMS_WORKLOAD_REPOSITORY需同时具备EXECUTE ON DBMS_WORKLOAD_REPOSITORY和SELECT ANY DICTIONARY权限,缺一不可;前者用于调用包内过程,后者用于访问DBA_HIST_*等数据字典视图,否则将分别报ORA-01031或ORA-00942错误。
普通用户执行 DBMS_WORKLOAD_REPOSITORY 需要哪些权限?
没有权限的普通用户执行 exec dbms_workload_repository.create_snapshot 会直接报错:ora-01031: insufficient privileges。这不是数据库没开 awr,而是权限链断了——dbms_workload_repository 是个被严格保护的系统包,连 select any dictionary 单独都不够。
-
EXECUTE权限必须显式授予该包:GRANT EXECUTE ON DBMS_WORKLOAD_REPOSITORY TO your_user; -
SELECT ANY DICTIONARY也必不可少,否则生成报告时查不到DBA_HIST_*视图(比如DBA_HIST_SNAPSHOT),会卡在“找不到快照”或报ORA-00942: table or view does not exist - 注意:不能用
SELECT_CATALOG_ROLE替代——它不包含对DBA_HIST_*的访问权,实测无效
为什么 SELECT ANY DICTIONARY 不是“可选”而是硬性依赖?
AWR 报告脚本(如 @?/rdbms/admin/awrrpt.sql)和函数(如 AWR_REPORT_HTML)内部大量依赖数据字典视图,例如:DBA_HIST_SNAPSHOT、DBA_HIST_SYSSTAT、DBA_HIST_SQLSTAT。这些视图属于数据字典,普通用户默认不可见。
-
SELECT ANY DICTIONARY是唯一能批量放开所有DBA_HIST_*和V$类视图的系统权限 - 试图用单个
GRANT SELECT ON SYS.DBA_HIST_SNAPSHOT TO ...会失败:这些对象是只读数据字典,无法直接授权 - 如果环境策略禁止
SELECT ANY DICTIONARY,只能由 DBA 代为运行脚本或封装成带定义者权限的存储过程
执行快照前,还要确认 AWR 功能是否真正启用
光有权限还不够——DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT 成功返回,不代表快照真进了仓库。常见静默失败原因是 AWR 被禁用或未初始化。
- 先检查控制表:
SELECT * FROM DBA_HIST_WR_CONTROL;。若无结果,说明 AWR 尚未启用(尤其在达梦 DM 或新装 Oracle 实例中) - Oracle 中需确保
STATISTICS_LEVEL = TYPICAL或ALL(BASIC会彻底关闭 AWR) - 达梦数据库(DM)额外要求:必须先运行
SP_INIT_AWR_SYS(1)创建 AWR 系统包及SYSAUX表空间,否则调用CREATE_SNAPSHOT会报PLS-00201: identifier 'DBMS_WORKLOAD_REPOSITORY' must be declared - 即使权限齐全,
SNAP_INTERVAL = +00000 00:00:00.0(即 0 分钟)也意味着 AWR 已被禁用,手动快照同样失效
最小可行授权命令与验证步骤
别猜,直接跑这三步验证是否真通了:
GRANT EXECUTE ON DBMS_WORKLOAD_REPOSITORY TO your_user; GRANT SELECT ANY DICTIONARY TO your_user; -- 验证权限 SELECT COUNT(*) FROM DBA_HIST_SNAPSHOT WHERE ROWNUM = 1; -- 验证函数可用(不报错即通过) EXEC DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT;
如果最后一步报错,重点看是不是达梦环境漏了 SP_INIT_AWR_SYS(1),或者 Oracle 的 STATISTICS_LEVEL 被设成了 BASIC——这两个坑比权限问题更隐蔽,且错误信息完全不提示根源。










