Na arquitetura Multitenant, tivemos a criação do conceito de common users e local users. O primeiro nos possibilita criar um usuário no CDB$ROOT e em todos os PDBs do container, além de sua criação automática nos PDBs gerados posteriormente. Sua identificação padrão possui o prefixo “C##”, que o distingue do local user que não possui nenhum prefixo. Este valor é definido no parâmetro “common_user_prefix”, conforme abaixo:
[oracle@quiasma ~]$ sqlplus / as sysdba
SQL*Plus: Release 18.0.0.0.0 - Production on Mon Apr 12 05:29:08 2021
Version 18.13.0.0.0
Copyright (c) 1982, 2018, Oracle. All rights reserved.
Connected to:
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.13.0.0.0
SQL> SHO PARAMETER common_user_prefix
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
common_user_prefix string C##
SQL>
Apenas 2 comentários sofre este prefixo: o melhor dos mundos é mantermos este valor, para não criarmos confusão ao administrar o ambiente. E caso o recurso de autenticação externa seja utilizada, devemos equalizar o valor do prefixo com o parâmetro “OS_AUTHENT_PREFIX” (que tem valor padrão como OPS$):
SQL> SHO PARAMETER OS_AUTHENT_PREFIX
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
os_authent_prefix string ops$
O comando abaixo nos ajuda a ver os common users do container root:
SQL> SHOW CON_NAME CON_ID;
CON_NAME
------------------------------
CDB$ROOT
CON_ID
------------------------------
1
SQL> set pagesize 80
SQL> col username format a30
SQL> SELECT DISTINCT USERNAME, ORACLE_MAINTAINED FROM CDB_USERS WHERE COMMON='YES' ORDER BY 1;
USERNAME O
------------------------------ -
ANONYMOUS Y
APPQOSSYS Y
AUDSYS Y
CTXSYS Y
DBSFWUSER Y
DBSNMP Y
DIP Y
DVF Y
DVSYS Y
GGSYS Y
GSMADMIN_INTERNAL Y
GSMCATUSER Y
GSMUSER Y
LBACSYS Y
MDDATA Y
MDSYS Y
OJVMSYS Y
OLAPSYS Y
ORACLE_OCM Y
ORDDATA Y
ORDPLUGINS Y
ORDSYS Y
OUTLN Y
REMOTE_SCHEDULER_AGENT Y
SI_INFORMTN_SCHEMA Y
SYS Y
SYS$UMF Y
SYSBACKUP Y
SYSDG Y
SYSKM Y
SYSRAC Y
SYSTEM Y
WMSYS Y
XDB Y
XS$NULL Y
35 rows selected.
Criando um common user (utilizando o parâmetro CONTAINER=ALL) e concedendo privilégio de create session:
SQL> CREATE USER C##BRUNO IDENTIFIED BY oracle CONTAINER=ALL;
User created.
SQL> GRANT CREATE SESSION TO C##BRUNO CONTAINER=ALL;
Grant succeeded.
Podemos ver que este container root não possui nenhum PDB, além do seed:
SQL> select name,open_mode from v$pdbs;
NAME
--------------------------------------------------------------------------------
OPEN_MODE
----------
PDB$SEED
READ ONLY
Criando um novo PDB a partir do seed:
SQL> CREATE PLUGGABLE DATABASE HIPOFISE1
ADMIN USER BSS IDENTIFIED BY oracle
DEFAULT TABLESPACE USERS
STORAGE (MAXSIZE 2G); 2 3 4
Pluggable database created.
SQL> ALTER PLUGGABLE DATABASE HIPOFISE1 OPEN;
Pluggable database altered.
SQL> ALTER PLUGGABLE DATABASE HIPOFISE1 SAVE STATE;
Pluggable database altered.
Conectando no container root com o common user criado:
[oracle@quiasma admin]$ sqlplus C##BRUNO/oracle@TALAMO
SQL*Plus: Release 18.0.0.0.0 - Production on Mon Apr 12 05:43:58 2021
Version 18.13.0.0.0
Copyright (c) 1982, 2018, Oracle. All rights reserved.
Connected to:
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.13.0.0.0
SQL> SHOW USER;
USER is "C##BRUNO"
Testando a conexão com o PDB HIPOFISE1, que foi criado posteriormente ao common user:
[oracle@quiasma admin]$ sqlplus C##BRUNO/oracle@HIPOFISE1
SQL*Plus: Release 18.0.0.0.0 - Production on Mon Apr 12 05:45:46 2021
Version 18.13.0.0.0
Copyright (c) 1982, 2018, Oracle. All rights reserved.
Last Successful login time: Mon Apr 12 2021 05:43:58 -03:00
Connected to:
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.13.0.0.0
SQL> SHOW USER;
USER is "C##BRUNO"
Conectado no CDB$ROOT, podemos identificar que não é possível criar um LOCAL USER nele:
SQL> conn / as sysdba
Connected.
SQL> SHO CON_ID CON_nAME
CON_ID
------------------------------
1
CON_NAME
------------------------------
CDB$ROOT
SQL> CREATE USER SPFC IDENTIFIED BY oracle CONTAINER=CURRENT;
CREATE USER SPFC IDENTIFIED BY oracle CONTAINER=CURRENT
*
ERROR at line 1:
ORA-65049: Creation of local user or role is not allowed in this container.
Criando um novo Common user:
SQL> CREATE USER C##BRUNO2 IDENTIFIED BY oracle CONTAINER=ALL;
User created.
No momento de conceder privilégios, caso não especifiquemos o CONTAINER=ALL, o Oracle considerará o valor CURRENT, ou seja, o privilégio será a nível local:
SQL> GRANT CREATE SESSION TO C##BRUNO2;
Grant succeeded.
Conectando no CDB$ROOT com o novo usuário:
[oracle@quiasma admin]$ sqlplus C##BRUNO2/oracle@TALAMO
SQL*Plus: Release 18.0.0.0.0 - Production on Mon Apr 12 05:50:46 2021
Version 18.13.0.0.0
Copyright (c) 1982, 2018, Oracle. All rights reserved.
Connected to:
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.13.0.0.0
SQL> SHOW USER;
USER is "C##BRUNO2"
SQL>
Porém ao tentar conectar no PDB com o mesmo usuário, não nos é permitido pois o privilégio de criar sessão foi dado localmente no CDB$ROOT:
[oracle@quiasma admin]$ sqlplus C##BRUNO2/oracle@HIPOFISE1
SQL*Plus: Release 18.0.0.0.0 - Production on Mon Apr 12 05:51:30 2021
Version 18.13.0.0.0
Copyright (c) 1982, 2018, Oracle. All rights reserved.
ERROR:
ORA-01045: user C##BRUNO2 lacks CREATE SESSION privilege; logon denied
Enter user-name:
Obs: Este procedimento foi criado pelo senhor Ahmed Baraka (www.ahmedbaraka.com) e foi apenas reproduzido por mim em um laboratório pessoal para fins de aprendizado.
Pingback: Enabling Common Users to View Information about specific PDBs – Bruno Santos da Silva
Pingback: Enabling Common Users to View Information about specific PDBs – SWIV