You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle 19c中容器用户查询所有PDB无结果的问题排查

解决Oracle 19c中CDB普通用户无法查询所有PDB列表的问题

问题描述

在Oracle 19c的CDB$ROOT中通过SQL*Plus执行以下操作创建并授权普通用户:

CREATE USER c##SOMMONITOR IDENTIFIED BY SOM;
GRANT CREATE SESSION TO c##SOMMONITOR;
GRANT SELECT ON v_$pdbs TO c##SOMMONITOR CONTAINER=ALL;

使用SYSTEM用户连接CDB$ROOT执行查询:

SELECT dbid, con_id, name FROM v$pdbs;

可正常返回所有PDB列表:

940078223    2   PDB$SEED
248774507 3   PRODPDB
428725798 4   PRODPDB2

但使用c##SOMMONITOR用户执行相同查询时无结果返回,需实现让该普通用户获取所有PDB列表。

解决方案

方法1:授予目录查询角色

在CDB$ROOT中以SYS或具备足够权限的用户执行以下授权,为c##SOMMONITOR用户授予SELECT_CATALOG_ROLE角色(容器级别设为ALL):

GRANT SELECT_CATALOG_ROLE TO c##SOMMONITOR CONTAINER=ALL;

该角色包含访问数据字典视图的必要权限,授权后c##SOMMONITOR用户连接CDB$ROOT执行SELECT dbid, con_id, name FROM v$pdbs;即可正常获取所有PDB列表。

方法2:授权并查询CDB专属视图

Oracle为CDB环境提供了CDB_PDBS专属视图,包含所有可插拔数据库的信息。若不想授予大范围角色,可单独授权该视图的查询权限:

GRANT SELECT ON CDB_PDBS TO c##SOMMONITOR CONTAINER=ALL;

之后用户可通过以下查询获取PDB列表:

SELECT dbid, con_id, name FROM CDB_PDBS;

注意事项

  • 确保c##SOMMONITOR用户连接的是CDB$ROOT容器,而非某个PDB。若连接到PDB,v$pdbs仅返回当前PDB信息,CDB_PDBS默认不可见(除非额外授权)。
  • 所有授权操作必须在CDB$ROOT容器中执行,且指定CONTAINER=ALL以确保权限在所有容器中生效。

内容的提问来源于stack exchange,提问作者erol cimen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 13:15:56