This topic describes how to create and manage a user in Multitenant database.
There are two types of users in Multitenant Database:
- Common User: User exists in all containers (root container and all PDBS).
- Local User: User exists on particular PDB only.
Similarly, Two types of role are available in Multitenant Database:
- Common Role: Role exists in all containers (root container and all PDBS).
- Local Role: Role exists on particular PDB only.
Note::: Common or Local User and Role are same way to create to manager.
Create Common User:
SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 4 SALESPDB MOUNTED 5 PDBTEST READ WRITE NO 7 PDBNODATA MOUNTED SQL> show parameter common NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ common_user_prefix string C##
Note::: Grant privileges to common user using container=all for root as well as PDBs. If don’t use container=all then it will applicable for container root only.
SQL> show con_name CON_NAME ------------------------------ CDB$ROOT SQL> create user c##usercon identified by oracle; User created. SQL> grant create session, connect, resource to c##usercon; Grant succeeded. SQL> conn c##usercon/oracle; Connected. SQL> show user USER is "C##USERCON" SQL> show con_name CON_NAME ------------------------------ CDB$ROOT SQL> conn / as sysdba Connected. SQL> conn c##usercon/oracle@pdbtest ERROR: ORA-01045: user C##USERCON lacks CREATE SESSION privilege; logon denied Warning: You are no longer connected to ORACLE. SQL> grant connect, resource to c##usercon container=all; Grant succeeded. SQL> conn c##usercon/oracle@pdbtest Connected. SQL> show user USER is "C##USERCON" SQL> show con_name CON_NAME ------------------------------ PDBTEST
Common user will be created in all PDBs automatically:
SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 4 SALESPDB MOUNTED 5 PDBTEST READ WRITE NO 7 PDBNODATA MOUNTED SQL> col USERNAME for A20 SQL> set linesize 100 SQL> SELECT username, b.name, user_id, a.con_id FROM cdb_users a, v$containers b WHERE a.con_id = b.con_id AND username = 'C##USERCON'; USERNAME NAME USER_ID CON_ID -------------------- ------------------------------ ---------- ---------- C##USERCON PDBTEST 105 5 C##USERCON CDB$ROOT 102 1 SQL> alter pluggable database pdbnodata open; Pluggable database altered. SQL> SELECT username, b.name, user_id, a.con_id FROM cdb_users a, v$containers b WHERE a.con_id = b.con_id AND username = 'C##USERCON'; USERNAME NAME USER_ID CON_ID -------------------- ------------------------------ ---------- ---------- C##USERCON PDBTEST 105 5 C##USERCON CDB$ROOT 102 1 C##USERCON PDBNODATA 105 7
Common user can be created only from root container:
SQL> alter session set container=PDBTEST; Session altered. SQL> show user USER is "SYS" SQL> create user c##usercon01 identified by oracle; create user c##usercon01 identified by oracle * ERROR at line 1: ORA-65094: invalid local user or role name
Create Local User:
SQL> alter session set container=PDBTEST; Session altered. SQL> show con_name CON_NAME ------------------------------ PDBTEST SQL> create user user_pdb identified by oracle; User created. SQL> grant create session, connect, resource to user_pdb; Grant succeeded. SQL> conn user_pdb/oracle@pdbtest Connected. SQL> show con_name CON_NAME ------------------------------ PDBTEST SQL> show user USER is "USER_PDB"
Local user can be created from PDB only but not from root container:
SQL> show user USER is "SYS" SQL> show con_name CON_NAME ------------------------------ CDB$ROOT SQL> create user user_pdb identified by oracle; create user user_pdb identified by oracle * ERROR at line 1: ORA-65096: invalid common user or role name
Common Role:
Common role has to be created same way like Common user.
- Role Name should be starting with C##
- Creates from root container.
- Can be assigned to common user as well as local users any PDBs.
- Common Role name is unique for entire database (CDB + PDBs).
SQL> create role c##role_hr; Role created. SQL> grant create session to c##role_hr; Grant succeeded. SQL> grant c##role_hr to c##usercon; Grant succeeded. SQL> grant c##role_hr to user_pdb; grant c##role_hr to user_pdb * ERROR at line 1: ORA-01917: user or role 'USER_PDB' does not exist SQL> alter session set container=pdbtest; Session altered. SQL> grant c##role_hr to user_pdb; Grant succeeded.
Local Role:
- Role Name should not starting with C##.
- Creates from a PDB.
- Can be assigned to local user of the PDB only.
- Local Role name is unique for a PDB.
SQL> create role role_local; Role created. SQL> grant create session, select any table to role_local; Grant succeeded. SQL> grant role_local to user_pdb; Grant succeeded. SQL> grant role_local to c##usercon; Grant succeeded.
Create an object from common user:
Can be created an object (like Table or View etc) with same name on CDB and PDBs from common user.
Table create on a CDB using common user:
SQL> show con_name CON_NAME ------------------------------ CDB$ROOT SQL> show user USER is "C##USERCON" SQL> Create table root_test (id number); Table created.
Table create on a PDB using common user:
SQL> show con_name CON_NAME ------------------------------ PDBNODATA SQL> show user USER is "C##USERCON" SQL> create table C##USERCON.root_test (id number); Table created.
Table create on a PDB using common user:
SQL> show con_name CON_NAME ------------------------------ PDBTEST SQL> show user USER is "C##USERCON" SQL> create table C##USERCON.root_test (id number); Table created.
Table with same name on all PDBs and Container for a common user:
col OWNER for A20 col OBJECT_NAME for A20 set linesize 100 SQL> SELECT a.con_id, b.name, owner, object_name, object_id FROM cdb_objects a, v$containers b WHERE a.con_id = b.con_id AND a.object_name = 'ROOT_TEST'; CON_ID NAME OWNER OBJECT_NAME OBJECT_ID ---------- ------------------------------ -------------------- -------------------- ---------- 7 PDBNODATA C##USERCON ROOT_TEST 91941 5 PDBTEST C##USERCON ROOT_TEST 91823 1 CDB$ROOT C##USERCON ROOT_TEST 92447