Oracle公共用户c##user查询V$CONTAINERS仅返回CDB$ROOT问题咨询
问题原因分析
Oracle 12c及以上版本的多租户架构中,V$CONTAINERS属于容器数据对象,这类对象(包含大部分动态性能视图、数据字典视图)默认遵循容器级访问控制规则:即便公共用户拥有对象的SELECT权限,默认也仅能返回当前连接容器的对应数据,不会自动返回其他容器的相关内容,这是Oracle内置的安全隔离机制,和你已授予的常规权限无关。
解决方案说明
你找到的ALTER USER c##user SET CONTAINER_DATA=(CDB$ROOT,ORCLPDB1) CONTAINER=CURRENT;就是该场景的官方标准解决方案,该配置用于显式指定公共用户可以访问哪些容器的容器数据对象内容,另外还有两种常用的扩展配置:
- 如果需要允许该用户访问所有容器的容器数据,无需逐个指定PDB名称,可执行:
ALTER USER c##user SET CONTAINER_DATA=ALL CONTAINER=CURRENT;
- 如果需要仅针对特定视图开放跨容器访问权限(符合最小权限原则,安全性更高),可通过
FOR参数限定生效对象,例如仅允许V$CONTAINERS返回多容器结果:
ALTER USER c##user SET CONTAINER_DATA=(CDB$ROOT,ORCLPDB1) FOR V_$CONTAINERS CONTAINER=CURRENT;
注意:上述所有修改语句都需要在CDB$ROOT容器下使用拥有ALTER USER权限的管理员用户执行。
内容的提问来源于stack exchange,提问作者Naros
相关产品推荐
相关产品推荐

