Oracle 12c Multitenant: Common User vs. Local User – Verwirrung Teil 2 – COMMON_USER_PREFIX

11. Februar 2015 Aus Von Markus Flechtner

Schon vor einiger Zeit hatte ich über das Verwirrungspotential, das die Oracle Multitenant Architektur mit den beiden Ebenen, auf denen User angelegt werden können, “common” und “local”, bietet,geschrieben. Mit Oracle 12.1.0.2 ist noch eine weitere Möglichkeit dazu gekommen, wie man denn bei der User-Verwaltung in einer CDB für Probleme sorgen kann.

Mit Oracle 12.1.0.1 musste ein Common User, d.h. ein User der in der CDB$ROOT angelegt wird und der dann in allen PDBs zur Verfügung, mit dem Präfix “C##” versehen werden. Andersherum kanne man in der CDB$ROOT keine “lokalen User”, d.h. User ohne dieses Prefix anlegen (Der Versuch endet mit einem “ORA-65049: creation of local user or role is not allowed in CDB$ROOT”).
Das Präfix “C##” ist sicher nicht das allerschönste, aber es ist recht auffällig und die Unterscheidung der beiden Usertypen ist dadurch recht einfach.

Mit Oracle 12.1.0.2 gibt es nun den Instance-Parameter COMMON_USER_PREFIX, mit dem das Präfix “C##” geändert werden kann. Und man kann es auch komplett deaktivieren (d.h. “leer” setzen). Das kann aber unschöne Auswirkungen haben:

Default für den Parameter ist C##:

SQL> show parameter common_user_prefix
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
common_user_prefix string C##

Dann legen wir eine neue PDB an:

SQL> CREATE PLUGGABLE DATABASE crm05 ADMIN USER crm05_adm IDENTIFIED BY manager ROLES=(DBA)
2 PATH_PREFIX = '/u01/oradata/'
3 STORAGE (MAXSIZE 2G MAX_SHARED_TEMP_SIZE 256M)
4 FILE_NAME_CONVERT = ('/u01/oradata/TVD12CDB/pdbseed/','/u01/oradata/TVD12CDB/crm05/')
5 DEFAULT TABLESPACE data DATAFILE '/u01/oradata/TVD12CDB/crm05/data_01.dbf' SIZE 25M AUTOEXTEND ON MAXSIZE 512M
6 TEMPFILE REUSE;

Pluggable database created.

SQL> ALTER PLUGGABLE DATABASE crm05 OPEN;
Pluggable database altered.

SQL> alter session set container=crm05;
Session altered.

SQL> show con_name
CON_NAME
——
CRM05

In dieser PDB legen wir jetzt einen lokalen User an:

SQL> create user DEMOUSER identified by LOCAL;
User created.
SQL> grant connect to DEMOUSER;
Grant succeeded.

Jetzt geht es zurück in den root-Container und wir hängen die PDB aus (UNPLUG).

SQL> alter session set container=CDB$ROOT;
Session altered.

SQL> alter pluggable database crm05 close;
Pluggable database altered.

SQL> ALTER PLUGGABLE DATABASE crm05 UNPLUG INTO ‘/u00/app/oracle/admin/TVD12CDB/crm05.xml’;
Pluggable database altered.

SQL> drop pluggable database crm05 keep datafiles;
Pluggable database dropped.

Im nächsten Schritt ändern wir den (statischen) Parameter COMMON_USER_PREFIX und starten die Instance durch:


SQL> alter system set common_user_prefix='' scope=spfile;
System altered.

SQL> shutdown immediatE;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup;
ORACLE instance started.

Total System Global Area 943718400 bytes
Fixed Size 2931136 bytes
Variable Size 348128832 bytes
Database Buffers 587202560 bytes
Redo Buffers 5455872 bytes
Database mounted.
Database opened.

Jetzt können wir auch einen common user “DEMOUSER” anlegen:


SQL> create user DEMOUSER identified by ALLCONTAINER container=all;
User created.

SQL> grant connect to demouser container=all;
Grant succeeded.

SQL> grant select any table to demouser container=all;
Grant succeeded

Was passiert jetzt, wenn wir die PDB crm05, die ja einen lokalen User “DEMOUSER” enthält, wieder in unsere CDB einhängen:


SQL> create pluggable database crm05 using '/u00/app/oracle/admin/TVD12CDB/crm05.xml' nocopy;
Pluggable database created.

SQL> alter pluggable database crm05 open;
Warning: PDB altered with errors.

Es funktioniert also nicht. Und das Problem ist – wie erwartet:

SQL> set linesize 100
SQL> select name,message from pdb_plug_in_violations;

NAME
——————————
MESSAGE
—————————————————————————————————-
CRM05
Sync PDB failed with ORA-65177 during ‘create user DEMOUSER identified by * container=all’

Der Text zu “ORA-65177” ist “cannot create common user with the same name as local user”.

Wir müssen den Common User DEMOUSER droppen, um die PDB öffnen zu können:

SQL> drop user demouser;
User dropped.

SQL> alter pluggable database crm05 close;
Pluggable database altered.

SQL> alter pluggable database crm05 open;
Pluggable database altered.

Zusammengefasst:
Es ist keine gute Idee, COMMON_USER_PREFIX zu deaktivieren. Oracle warnt in der 12.1.0.2-Reference auch davor:

“Setting this parameter to an empty string will result in no restrictions being placed on names of common and local users, roles, and profiles, which could lead to conflicts between the names of local and common users, roles, and profiles when a PDB is plugged into a different CDB, or when opening a PDB that was closed when a common user was created.”

Wem das Default-Präfix “C##” nicht gefällt, der kann natürlich gerne ein anderes Präfix verwenden (“COMMON_”,”COM_”, etc.), aber bitte keinesfalls das Präfix deaktivieren.


Werbung (Amazon-Partner-Link)