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
相关产品推荐
相关产品推荐

