В КОНТЕЙНЕРАХ V$отображается только корень CDB

#oracle #oracle19c

Вопрос:

Я создал обычного пользователя c##user , и ему были назначены следующие разрешения:

   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$и запускаю SELECT * FROM V$CONTAINERS единственную возвращаемую строку, которая CDB$ROOT соответствует строке «но есть ORCLPDB1 открытая и доступная». Если я выполню:

 ALTER SESSION SET CONTAINER=ORCLPDB1;
SELECT * FROM V$CONTAINERS;
 

Тогда запрос возвращает информацию только для ORCLPDB1 того, что указано в документации. Но почему, когда я подключен к корневому каталогу CDB и выполняю один и тот же запрос, V$CONTAINERS я не вижу никаких PDF-файлов?

Я понимаю, что обычный пользователь должен видеть ORCLPDB1 в V$CONTAINERS представлении только тогда, когда я подключен к CDB$ROOT , но этого не происходит. Есть ли здесь проблема с разрешениями, которую я не вижу?

Обновить

Похоже, что обычному пользователю должен быть явно предоставлен доступ к данным контейнера, используя следующее, выполненное администратором, чтобы V$CONTAINERS представление возвращало результаты помимо текущего контейнера.

 ALTER USER c##user SET CONTAINER_DATA=(CDB$ROOT,ORCLPDB1) CONTAINER=CURRENT;
 

Это ожидаемый способ справиться с этим?

Комментарии:

1. А как насчет v$pdbs ? Какую информацию он показывает ?

Ответ №1:

Да, это ожидаемое поведение системы.

В соответствии с документацией Oracle:

Расширенные связанные с данными объекты словаря данных, поставляемые Oracle

Этот тип объектов хранит данные, относящиеся к корню CDB, а также данные, относящиеся к отдельным PDB.

Когда этот тип объекта запрашивается из корневого каталога CDB, возвращаются только данные, относящиеся к корневому каталогу CDB.

Так v$container же как и расширенные объекты данных, поскольку они содержат данные как о корне, так и о других PDB, и, следовательно, по умолчанию в них будут отображаться только данные о корне.

 ALTER USER c##user SET CONTAINER_DATA=(CDB$ROOT,ORCLPDB1) CONTAINER=CURRENT;
 

Вышеуказанное изменение позволит системе также отображать данные о PDB ORCLPDB1, и если вы снова измените его, как показано ниже, он покажет данные только корневого каталога

 ALTER USER c##user SET CONTAINER_DATA=(CDB$ROOT) CONTAINER=CURRENT;