27.02.2016 1 min to read

Oracle 12c. ORA-65049, ORA-65096 или особенности создания пользователей в CDB и PDB

Category : Статьи

При наличии контейнера и подключаемых БД структура пользователей претерпела изменения и немного усложнилась. Пользователь может быть создан на “глобальном” уровне в 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