Managing Multitenant Common Users

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.

2 thoughts on “Managing Multitenant Common Users”

  1. Pingback: Enabling Common Users to View Information about specific PDBs – Bruno Santos da Silva

  2. Pingback: Enabling Common Users to View Information about specific PDBs – SWIV

Leave a Comment

Your email address will not be published.