SELECT_CATALOG_ROLE 是 Oracle 预定义的系统角色,核心作用是授予普通用户查询数据字典(Catalog)的 SELECT 权限,也是 Oracle 推荐的、安全的 “字典查询权限”(替代直接授予 SELECT ANY DICTIONARY 或对 SYS 基表的直接 SELECT 权限)。以下是其具体权限的详细拆解:
一、核心定位
- 归属:由
SYS用户拥有,仅包含 SELECT 权限(无 DML/DDL/EXECUTE 等修改 / 执行权限); - 目标:覆盖 Oracle 核心数据字典视图 / 表的查询权限,让普通用户能访问
DBA_*、V$、GV$等高级字典,而非仅能查USER_*/ALL_*视图。
二、具体权限范围(按功能分类)
SELECT_CATALOG_ROLE 授予的是对 SYS 模式下核心字典对象的 SELECT 权限,具体涵盖以下类别:
1. 数据库对象元数据(最核心)
可查询所有模式下的对象定义、结构信息,包括:
| 字典对象类型 | 典型视图 / 表 | 用途说明 |
|---|---|---|
| 表 / 视图 / 同义词 | DBA_TABLES、DBA_VIEWS、DBA_SYNONYMS | 查询所有模式的表 / 视图 / 同义词定义 |
| 索引 / 约束 | DBA_INDEXES、DBA_CONSTRAINTS | 查询索引、主键 / 外键 / 唯一约束等 |
| 存储过程 / 包 / 函数 | DBA_PROCEDURES、DBA_PACKAGES | 查询存储过程 / 包的元数据(无执行权限) |
| 序列 / 触发器 | DBA_SEQUENCES、DBA_TRIGGERS | 查询序列定义、触发器元数据 |
| 列 / 注释 | DBA_TAB_COLUMNS、DBA_COL_COMMENTS | 查询表列结构、字段注释 |
2. 用户 / 角色 / 权限管理
可查询系统中所有用户、角色、权限的分配信息:
| 字典对象 | 用途说明 |
|---|---|
| DBA_USERS | 查询所有数据库用户(密码哈希、状态、默认表空间等) |
| DBA_ROLES | 查询所有角色定义 |
| DBA_SYS_PRIVS | 查询用户 / 角色的系统权限分配 |
| DBA_ROLE_PRIVS | 查询角色的继承关系(如角色授予给用户 / 其他角色) |
| DBA_TAB_PRIVS | 查询对象级权限(如用户对表的 SELECT/UPDATE 权限) |
| DBA_COL_PRIVS | 查询列级权限(如用户对表某列的 UPDATE 权限) |
3. 存储与表空间
可查询数据库存储资源的分配、使用情况:
| 字典对象 | 用途说明 |
|---|---|
| DBA_TABLESPACES | 查询所有表空间定义 |
| DBA_DATA_FILES | 查询数据文件与表空间的关联 |
| DBA_SEGMENTS | 查询段(表 / 索引)的存储分配 |
| DBA_EXTENTS | 查询段的扩展区信息 |
| DBA_FREE_SPACE | 查询表空间的空闲空间 |
| DBA_TEMP_FILES | 查询临时文件信息 |
4. 会话 / 性能 / 系统状态
可查询数据库运行时的会话、SQL、锁、性能等信息:
| 字典对象 | 用途说明 |
|---|---|
| VSESSION/GVSESSION | 查询当前会话(RAC 用 GV$) |
| V$PROCESS | 查询会话对应的操作系统进程 |
| VSQL/VSQLAREA | 查询执行过的 SQL 语句 |
| V$LOCK | 查询数据库锁(阻塞 / 等待) |
| V$TRANSACTION | 查询事务信息 |
| V$INSTANCE | 查询实例状态(启动时间、版本等) |
| V$DATABASE | 查询数据库基本信息(名称、字符集、归档模式等) |
5. 备份 / 恢复
可查询备份、归档、恢复相关的元数据:
| 字典对象 | 用途说明 |
|---|---|
| V$BACKUP | 查询数据文件的备份状态 |
| V$ARCHIVED_LOG | 查询归档日志信息 |
| V$RECOVERY_FILE_DEST | 查询闪回恢复区(FRA)信息 |
| V$BACKUP_SET | 查询 RMAN 备份集信息 |
6. SYS 基表(底层)
间接授予对 SYS 模式下底层字典基表的 SELECT 权限(普通用户极少直接查询,但角色包含此权限):
- 如
TAB$(表的底层存储)、COL$(列的底层存储)、OBJ$(对象的底层存储)、USER$(用户的底层存储)等。
三、版本差异(关键)
Oracle 不同版本中,SELECT_CATALOG_ROLE 的权限范围略有调整:
| 版本 | 差异点 |
|---|---|
| 11g 及之前 | 包含所有 V$/GV$ 视图的 SELECT 权限,是字典查询的核心角色; |
| 12c+/18c+/19c/21c | 1. 部分新增的字典视图权限拆分到 SELECT ANY DICTIONARY 角色;2. V$ 视图的权限仍包含,但部分云原生 / CDB 相关字典(如 CDB_*)需补充权限;3. PDB 环境中,该角色仅能查询当前 PDB 的字典,跨 PDB 需额外授权。 |
四、重要特点
- 仅读权限:无任何 INSERT/UPDATE/DELETE/ALTER/DROP 等修改类权限,也无 EXECUTE 权限(仅能查存储过程元数据,不能执行);
- 安全替代方案:避免直接授予
SELECT ANY DICTIONARY(更宽泛的系统权限),降低普通用户的权限风险; - DBA_ 视图访问*:普通用户默认只能查
USER_*(自己的对象)、ALL_*(有权限的对象),授予该角色后可查DBA_*(所有对象); - 无管理权限:无法执行
CREATE USER、GRANT、ALTER SYSTEM等管理操作。
五、如何验证该角色的具体权限
可通过以下 SQL 查询 SELECT_CATALOG_ROLE 被授予的所有具体权限:
-- 1. 查询该角色的对象级权限(对SYS字典表/视图的SELECT权限)
SELECT
tp.owner,
tp.table_name,
tp.privilege,
tp.grantable
FROM dba_tab_privs tp
WHERE tp.grantee = 'SELECT_CATALOG_ROLE'
ORDER BY tp.table_name;
-- 2. 查询该角色的系统权限(极少,主要是对象级权限)
SELECT
sp.privilege,
sp.admin_option
FROM dba_sys_privs sp
WHERE sp.grantee = 'SELECT_CATALOG_ROLE';
-- 3. 简化版:统计该角色可访问的字典对象数量
SELECT COUNT(*) AS total_catalog_objects
FROM dba_tab_privs
WHERE grantee = 'SELECT_CATALOG_ROLE'
AND privilege = 'SELECT';
总结
SELECT_CATALOG_ROLE 是 Oracle 为 “安全查询数据字典” 设计的最小权限角色,涵盖了所有核心字典视图 / 表的 SELECT 权限,满足普通用户(如开发、运维)查询数据库元数据、性能、权限、存储等信息的需求,且无修改类权限,是生产环境中授予字典查询权限的首选。

徐万新之路

