lundi 27 juillet 2015

Oracle 12c : ORA-65096 lors de la création d’un user

Si vous obtenez l’erreur ORA-65096 après une commande CREATE USER c’est que vous êtes sur une instance oracle 12c multinenant et que vous tentez de créer un user local dans le root container. Le multitenant de la 12c intègre une nouvelle différenciation entre les users dits "communs" et les users dits "locaux". Le local user est celui qui est créé sous une pluggable database (PDB) et dont les privilèges sont limités à cette PDB alors que le common user est celui créé sous le container root et dont les privilèges peuvent s’appliquer sur toutes les PDBs.

Voici un exemple pour bien comprendre :

Disons que j’ai besoin de créer un user AHMED dans ma base de données 12c multitenant. En 11g ou avec une base non-multitenant je n’ai qu’à me connecter en sys et exécuter une commande de type CREATE USER mais si j’agis de la même manière sur ma base multitenant voilà ce que j’obtiens : 

C:\Ahmed\Scripts\sqlplus>sqlplus / as sysdba

SQL*Plus: Release 12.1.0.2.0 Production on Jeu. Juil. 23 09:21:41 2015

Copyright (c) 1982, 2014, Oracle. All rights reserved.

Connecté :

Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production

With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> show user

USER est "SYS"

SQL> create user ahmed identified by "ahmed#1" container=current;

create user ahmed identified by "ahmed#1" container=current

 *

ERROR at line 1:

ORA-65049: creation of local user or role is not allowed in CDB$ROOT
 

SQL> create user ahmed identified by "ahmed#1" container=all;

create user ahmed identified by "ahmed#1" container=all

 *

ERROR at line 1:

ORA-65096: invalid common user or role name


J’obtiens un message d’erreur qui me dit qu’il m’est impossible de créer un local user ou un role sous le container root. En effet, si j’affiche le nom du container je m’aperçois que je suis bien sous le ROOT :
SQL> show con_name
 

CON_NAME
------------------------------
CDB$ROOT

Si je souhaite créer un user pour une PDB en particulier alors je dois me connecter à cette PDB et créér un user qui sera local :
 SQL> alter session set container=PDB1;

Session altered. 


SQL> show con_name

CON_NAME
--------------------
PDB1


SQL> create user ahmed identified by "ahmed#1";

User created.
Cette fois-ci mon user AHMED a bien été créé.

Si j’avais voulu créé un common user c’est-à-dire un user se trouvant dans le container ROOT, j’aurais dû préfixer le nom du user par c## : 

SQL> show user

USER est "SYS"

SQL> sho con_name

CON_NAME
----------------------
CDB$ROOT

SQL> create user c##ahmed identified by "ahmed#1";

User created.

2 commentaires:

  1. Ce dernier sujet est parfaitement du cours oracle database 12c,
    Un sujet très important qui n'a jamais été traité au niveau Performance et Tuning, c'est
    AMELIORATION DES REQEUTES SQL avec --> les materialized views, que vous n'avez jamais traité dans un context professionnel ?
    merci quand même pour tous les autres sujets !

    RépondreSupprimer
  2. Hello Ahmed... Et disons que que je suis borné (en fait juste DBA), et que j'ai pas envie de changé ma norme sur des user (genre compte de service, ou d'admin qui tournent sur des versions antérieures..)

    alter session set "_ORACLE_SCRIPT"=true;
    create user ahmed identified by "ahmed#1";
    User created.

    Bon ok.. c'est mal d'utilisé des paramètres cachés.

    RépondreSupprimer