#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;