Create USER
Uno User deve inizare con una lettera e non può contenere caratteri speciali.
Per creare un utente nel Container e che sia visibile nei suoi Pluggable database usare il prefisso C##.
Si chiama Common User come quelli di tipo amministrativo che sono "sys" e "system".
Un Local user è invece è un utente creato all'interno di un pdb ed uno stesso local user può essere creato in differenti pdb.
Colleghiamoci al conainer root:
SQL> conn /as sysdba
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> select username, common, con_id from CDB_USERS order by username;
---------- --- -----------------------------
SYS YES 1
SYS YES 3
HR NO 3
L'utente SYS è comune al container e al pdb (con_id=3) mentre HR è un local user perché è definito solo nel pdb.
All'interno del Root Container non si può creare un local user ma solo un common user.
SQL> create user pippo identified by pippo;
create user pippo identified by pippo
*
ERRORE alla riga 1:
ORA-65096: nome utente o ruolo comune non valido
Un Common User è definito da un prefisso che è visibile dai parametri del db.
SQL> show parameter common_user_prefix
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
common_user_prefix string C##
SQL> create user c##pippo identified by pippo CONTAINER=ALL;
Container=ALL è opzionale.
SQL> select username, common, con_id from cdb_users where username ='C##PIPPO';
USERNAME COM CON_ID
---------- --- ---------------------------
C##PIPPO YES 1
C##PIPPO YES 3
Occorre fornire le grant all'utente creato
SQL> grant create session to c##pippo;
Con queste grant si connette solo al root container:
[oracle@test ~]$ sqlplus c##pippo/pippo@test.com:1521/orcl.com
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> show user
USER is "C##PIPPO"
[oracle@test ~]$ sqlplus c##pippo/pippo@test.com:1521/orclpdb.com
ERROR:
ORA-01045: user C##PIPPO lacks CREATE SESSION privilege; logon denied
Occore fornire la grant con l'opzione container all.
[oracle@test ~]$ sqlplus c##pippo/pippo@test.com:1521/orclpdb.com
...
SQL> show user
USER is "C##PIPPO"
SQL> show con_name
CON_NAME
------------------------------
ORCLPDB
**********************************************************************************
Anche per i RUOLI creati a livello di container occorre utilizzare il prefisso c## altrimenti si ha l'errore.
Non esitono local role nel Root Container.
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> create role test_role;
create role test_role
*
ERROR at line 1:
ORA-65096: invalid common user or role name
SQL> create role c##test_role;
Assegnamo alcuni priviligei di sitema al ruolo creato, e poi assegniamo il ruolo ad un Common User.
SQL> grant create session, create table to c##test_role container=all;
SQL> create user c##bat identified by bat;
SQL> grant c##test_role to c##bat container=all;
SQL> conn c##bat/bat@test.com:1521/orcl.com
SQL> show user
USER is "C##BAT"
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> conn c##bat/bat@test.com:1521/orclpdb.com
SQL> show user
USER is "C##BAT"
SQL> show con_name
CON_NAME
------------------------------
ORCLPDB
Se ad un Common User si danno le grant di "create session" all'interno di un pdb, non sarà possibile collegarsi al Root Container con questo utente.
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> create user c##rob identified by rob;
User created.
SQL> alter session set container=PDB2;
Session altered.
SQL> grant c##test_role to c##rob;
Grant succeeded.
Facciamo una prova di connessione:
SQL> conn c##rob/rob@test.com:1521/orcl.com
ERROR:
ORA-01045: user C##ROB lacks CREATE SESSION privilege; logon denied
SQL> conn c##rob/rob@test.com:1521/orclpdb.com
ERROR:
ORA-01045: user C##ROB lacks CREATE SESSION privilege; logon denied
SQL> conn c##rob/rob@test.com:1521/pdb2.com
Connected.