Neste artigo simples, vamos explorar a administração de privilégios do tipo common ou local, tanto a nível de root container ou PDBs, na arquitetura Multitetant.
Pela consulta abaixo, podemos ver que o privilégio de create session foi concedido para os usuários C##BRUNO (common) e LOCALUSER (local) nos containers seguintes:
[oracle@quiasma admin]$ sqlplus / as sysdba
SQL*Plus: Release 18.0.0.0.0 - Production on Tue Apr 13 05:20:43 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> col grantee format a18
SQL> col privilege format a14
SQL> SELECT GRANTEE, PRIVILEGE, COMMON, CON_ID FROM CDB_SYS_PRIVS WHERE GRANTEE IN ('C##BRUNO', 'LOCALUSER');
GRANTEE PRIVILEGE COM CON_ID
------------------ -------------- --- ----------
C##BRUNO CREATE SESSION YES 1
LOCALUSER CREATE SESSION NO 3
C##BRUNO CREATE SESSION YES 3
Ao logar no PDB, temos a seguinte imagem:
SQL> conn system/oracle@HIPOFISE1
Connected.
SQL> col grantee format a18
SQL>
SQL> col privilege format a14
SQL> SELECT GRANTEE, PRIVILEGE, COMMON, CON_ID FROM CDB_SYS_PRIVS WHERE GRANTEE IN ('C##BRUNO', 'LOCALUSER');
GRANTEE PRIVILEGE COM CON_ID
------------------ -------------- --- ----------
LOCALUSER CREATE SESSION NO 3
C##BRUNO CREATE SESSION YES 3
Concedendo privilégios para o common user, contemplando todos os containers:
SQL> conn / as sysdba
Connected.
SQL> GRANT CREATE TABLE, UNLIMITED TABLESPACE TO C##BRUNO CONTAINER=ALL;
Grant succeeded.
SQL> col grantee format a12
SQL> col privilege format a30
SQL> SELECT GRANTEE, PRIVILEGE, COMMON, CON_ID FROM CDB_SYS_PRIVS WHERE GRANTEE = 'C##BRUNO' ORDER BY 1,2;
GRANTEE PRIVILEGE COM CON_ID
------------ ------------------------------ --- ----------
C##BRUNO CREATE SESSION YES 1
C##BRUNO CREATE SESSION YES 3
C##BRUNO CREATE TABLE YES 3
C##BRUNO CREATE TABLE YES 1
C##BRUNO UNLIMITED TABLESPACE YES 3
C##BRUNO UNLIMITED TABLESPACE YES 1
6 rows selected.
Concedendo privilégio de criar sequence apenas no root container. Ou seja, faremos o local grant para um common user. O quanto pudermos evitar essa situação em ambientes oficiais, melhor, para evitar confusões.
SQL> SHOW CON_ID CON_NAME;
CON_ID
------------------------------
1
CON_NAME
------------------------------
CDB$ROOT
SQL> GRANT CREATE SEQUENCE TO C##BRUNO CONTAINER=CURRENT;
Grant succeeded.
SQL> SELECT GRANTEE, PRIVILEGE, COMMON, CON_ID FROM CDB_SYS_PRIVS WHERE GRANTEE = 'C##BRUNO' AND PRIVILEGE ='CREATE SEQUENCE';
GRANTEE PRIVILEGE COM CON_ID
------------ ------------------------------ --- ----------
C##BRUNO CREATE SEQUENCE NO 1
Concedendo privilégio para o common user apenas em um PDB:
SQL> ALTER SESSION SET CONTAINER=HIPOFISE1;
Session altered.
SQL> GRANT CREATE SYNONYM TO C##BRUNO CONTAINER=CURRENT;
Grant succeeded.
SQL> col grantee format a18
SQL> SELECT GRANTEE, PRIVILEGE, COMMON, CON_ID FROM CDB_SYS_PRIVS WHERE GRANTEE = 'C##BRUNO' AND PRIVILEGE ='CREATE SYNONYM';
GRANTEE PRIVILEGE COM CON_ID
------------------ ------------------------------ --- ----------
C##BRUNO CREATE SYNONYM NO 3
Concedendo privilégio para um local user em um PDB específico:
SQL> ALTER SESSION SET CONTAINER=HIPOFISE1;
Session altered.
SQL> GRANT UNLIMITED TABLESPACE TO LOCALUSER;
Grant succeeded.
SQL> col grantee format a18
SQL> SELECT GRANTEE, PRIVILEGE, COMMON, CON_ID FROM CDB_SYS_PRIVS WHERE GRANTEE = 'LOCALUSER';
GRANTEE PRIVILEGE COM CON_ID
------------------ ------------------------------ --- ----------
LOCALUSER UNLIMITED TABLESPACE NO 3
LOCALUSER CREATE SESSION NO 3
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.