首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >V$CONTAINERS只显示CDB根

V$CONTAINERS只显示CDB根
EN

Stack Overflow用户
提问于 2021-07-04 06:56:32
回答 1查看 338关注 0票数 2

我已经创建了一个通用用户c##user,并为它分配了以下权限:

代码语言:javascript
复制
  GRANT CREATE SESSION TO c##user CONTAINER=ALL;
  GRANT SET CONTAINER TO c##user CONTAINER=ALL;
  GRANT SELECT ON V_\$DATABASE TO c##user CONTAINER=ALL;
  GRANT FLASHBACK ANY TABLE TO c##user CONTAINER=ALL;
  GRANT SELECT ANY TABLE TO c##user CONTAINER=ALL;
  GRANT SELECT_CATALOG_ROLE TO c##user CONTAINER=ALL;
  GRANT EXECUTE_CATALOG_ROLE TO c##user CONTAINER=ALL;
  GRANT SELECT ANY TRANSACTION TO c##user CONTAINER=ALL;
  GRANT SELECT ANY DICTIONARY TO c##user CONTAINER=ALL;
  GRANT LOGMINING TO c##user CONTAINER=ALL;
  GRANT CREATE TABLE TO c##user CONTAINER=ALL;
  GRANT ALTER ANY TABLE TO c##user CONTAINER=ALL;
  GRANT LOCK ANY TABLE TO c##user CONTAINER=ALL;
  GRANT CREATE SEQUENCE TO c##user CONTAINER=ALL;
  GRANT EXECUTE ON DBMS_LOGMNR TO c##user CONTAINER=ALL;
  GRANT EXECUTE ON DBMS_LOGMNR_D TO c##user CONTAINER=ALL;
  GRANT SELECT ON V_\$LOGMNR_LOGS TO c##user CONTAINER=ALL;
  GRANT SELECT ON V_\$LOGMNR_CONTENTS TO c##user CONTAINER=ALL;
  GRANT SELECT ON V_\$LOGFILE TO c##user CONTAINER=ALL;
  GRANT SELECT ON V_\$ARCHIVED_LOG TO c##user CONTAINER=ALL;
  GRANT SELECT ON V_\$ARCHIVE_DEST_STATUS TO c##user CONTAINER=ALL;

但是,当我与这个用户连接到CDB$ROOT并运行SELECT * FROM V$CONTAINERS时,唯一返回的行是CDB$ROOT的行,但是有一个打开和可用的ORCLPDB1。如果我执行:

代码语言:javascript
复制
ALTER SESSION SET CONTAINER=ORCLPDB1;
SELECT * FROM V$CONTAINERS;

然后,查询只返回ORCLPDB1的信息,文档说应该这样做。但是,为什么当我连接到CDB根并对V$CONTAINERS运行相同的查询时,我没有看到任何PDBs?

我明白,只有当我连接到ORCLPDB1时,普通用户才会在V$CONTAINERS视图中看到CDB$ROOT,但这并没有发生。这里有什么我看不见的许可问题吗?

更新

看起来,必须使用管理员为V$CONTAINERS视图执行的以下命令显式地授予普通用户对容器数据的访问权限,以返回当前容器之外的结果。

代码语言:javascript
复制
ALTER USER c##user SET CONTAINER_DATA=(CDB$ROOT,ORCLPDB1) CONTAINER=CURRENT;

这是我们想要的处理方法吗?

EN

回答 1

Stack Overflow用户

发布于 2021-07-04 17:25:44

是的,这是系统的预期行为。

根据Oracle文档:

扩展数据链接Oracle提供的数据字典对象

这种类型的对象存储与CDB根相关的数据,以及与单个PDB相关的数据。

当从CDB根查询此类型的对象时,只返回与CDB根相关的数据。

因此,v$container是一个扩展的数据对象,因为它包含有关根和其他PDB的数据,因此默认情况下它只显示有关根的数据。

代码语言:javascript
复制
ALTER USER c##user SET CONTAINER_DATA=(CDB$ROOT,ORCLPDB1) CONTAINER=CURRENT;

上面的alter将使系统也能够显示关于ORCLPDB1 PDB的数据,如果您再次按下面的方式修改它,它将只显示ROOT的数据。

代码语言:javascript
复制
ALTER USER c##user SET CONTAINER_DATA=(CDB$ROOT) CONTAINER=CURRENT;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68242412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档