При наличии контейнера и подключаемых БД структура пользователей претерпела изменения и немного усложнилась. Пользователь может быть создан на “глобальном” уровне в CDB и на “локальном” – в PDB. Пользователи, создаваемые в CDB, являются общими для всех подключаемых БД и могут управлять как CDB, так и всеми PDB. Пользователь, созданный в PDB, является локальным и работает только с той подключаемой базой, в которой он был создан.
В связи с описанными нововведениями при управлении пользователями можно столкнуться с несколькими ошибками:
Создание локальных пользователей.
ORA-65049: создание локальных пользователей и ролей в CDB$ROOT запрещено
При подключении к контейнерной БД мы попадаем в CDB$ROOT. Здесь возможно создание только общих пользователей, поэтому попытка создания обычного локального пользователя в CDB приведет к ошибке.
SQL> create user testuser identified by t container=current; create user testuser identified by t container=current * ошибка в строке 1: ORA-65049: создание локальных пользователей и ролей в CDB$ROOT запрещено
Чтобы создать локального пользователя, следует перейти в PDB и выполнить команду создания пользователя.
SQL> alter session set container=MYPDB; Сеанс изменен. SQL> create user testuser identified by t container=current; Пользователь создан. или SQL> create user testuser identified by t; Пользователь создан.
Создание общих пользователей.
ORA-65096: недопустимое имя пользователя или имя роли
При попытке создания общего пользователя в CDB может появиться ошибка, связанная с именем создаваемого пользователя, т.к. все имена глобальных пользователей должны начинаться с приставки C## или c##.
SQL> show con_name CON_NAME ------------------------------ CDB$ROOT SQL> create user testuser identified by t; create user testuser identified by t * ошибка в строке 1: ORA-65096: недопустимое имя общего пользователя или имя роли SQL> create user c##testuser identified by t; Пользователь создан.
ORA-65050: Обычные DDL разрешены только в CDB$ROOT
Создание общего пользователя из PDB также приведет к ошибке:
SQL> show con_name CON_NAME ------------------------------ MYPDB SQL> create user c##testuser identified by t container=all; create user c##testuser identified by t container=all * ошибка в строке 1: ORA-65050: Обычные DDL разрешены только в CDB$ROOT
ORA-65066: Указанные изменения необходимо применить ко всем контейнерам
Изменить параметры общего пользователя для определенной PDB нельзя. Изменения можно применять находясь также только в CDB.
SQL> show con_name CON_NAME ------------------------------ MYPDB SQL> alter user c##testuser identified by ttt; alter user c##testuser identified by ttt * ошибка в строке 1: ORA-65066: Указанные изменения необходимо применить ко всем контейнерам SQL> alter user c##testuser identified by ttt container=all; alter user c##testuser identified by ttt container=all * ошибка в строке 1: ORA-65050: Обычные DDL разрешены только в CDB$ROOT SQL> alter session set container=cdb$root; Сеанс изменен. SQL> alter user c##testuser identified by ttt; Пользователь изменен.
Просмотр списка пользователей
Находясь в PDB можно получить список всех общих, а также локальных пользователей, относящихся к данной PDB. Из CDB можно получить только список общих пользователей.
SQL> show con_name CON_NAME ------------------------------ MYPDB SQL> select username from dba_users where username like '%TESTUSER%'; USERNAME ----------------------------------------------------------------- C##TESTUSER TESTUSER
SQL> show con_name CON_NAME ------------------------------ CDB$ROOT SQL> select username from dba_users where username like '%TESTUSER%'; USERNAME ----------------------------------------------------------------- C##TESTUSER