En diversos foros de internet se hace referencia a este error al intentar crear un usuario en una base de datos de Oracle. Y es un error que se nos presentó a muchos estudiantes en el primer semestre de la carrera:

Informe de error -
ORA-65096: nombre de usuario o rol común no válido
65096. 00000 -  "invalid common user or role name"
*Cause:    An attempt was made to create a common user or role with a name
           that was not valid for common users or roles. In addition to the
           usual rules for user and role names, common user and role names
           must consist only of ASCII characters, and must contain the prefix
           specified in common_user_prefix parameter.
*Action:   Specify a valid common user or role name.

También en muchos sitios de internet se indica como solución a este problema el uso de la instrucción:

alter session set "_ORACLE_SCRIPT"=TRUE

Sin embargo, el uso de esta «solución» es potencialmente problemática y -lo más importante- absolutamente innecesaria si se entiende el orígen del error.

Pero para entenderlo tenemos que conocer un par de conceptos fundamentales a la hora de trabajar con bases de datos Oracle: qué es una CDB y qué es una PDB.

CDBs y PDBs

Desde la versión 12c (lanzada en julio de 2014), Oracle introdujo una nueva arquitectura o diseño de bases de datos, denominada “multitenant container database” (base de datos de tipo contenedor) o CDB.

Esta CDB puede incluir cero o más «pluggable databases» (bases de datos conectables) o PDB.

Una PDB es similar a lo que era una base de datos antes de la versión 12c.

¿Estamos operando sobre una CDB o sobre una PDB?

Cuando instalamos Oracle XE (18c, 19c o 21c), el instalador hizo estas 3 cosas:

  • Instaló el Software
  • Creó la Instancia XE, (XE es el nombre de la CDB asociada a ella).
  • Creó una PDB inicial, llamada XEPDB1, para que podamos comenzar a «trabajar» directamente en esa PDB.

O sea que en nuestra «base de datos» tenemos tanto una CDB (XE) como una PDB (XEPDB1).

Si cuando creamos nuestra conexión en SQL Developer, en el campo SID dejamos seleccionado lo que aparece por defecto («xe»), los comandos que ejecutemos en esta conexión, operan sobre nuestra CDB.

¿Por qué se presenta este error?

Surge cuando intentamos crear un «usuario común» sin respetar la sintaxis respecto a su nombre.

Resumiendo mucho, un usuario común es un usuario que puede operar tanto en la CDB como en cualquiera de las PDB contenidas en dicha CDB.

Como en la conexión que creamos estamos operando a nivel de la CDB, el comando de creación de usuario hace referencia a la creación de un «usuario común». Y la creación de un usuario común exige una sintaxis específica para el nombre de dicho usuario.

Concretamente, el nombre de un usuario común debe comenzar con los caracteres especificados por el parámetro de inicialización COMMON_USER_PREFIX, dichos caracteres por defecto son c## o C##.

Por eso si, por ejemplo, ejecutamos el comando de creación de usuario con el nombre C##INSTITUTO, funciona sin problemas:

¿Sí o sí es necesario agregar C## al nombre de un usuario?

No necesariamente.

Un nombre de usuario sin el prefijo C## es correcto para la creación de un usuario local (no de un usuario común).

Para crear un usuario local debemos estar conectados a la PDB. Para ello debemos crear y utilizar una conexión con la PDB (XEPDB1 en nuestro caso):

Entonces, ejecutando el comando de creación de usuario desde una conexión con la PDB, si se utiliza un nombre sin el prefijo C## funciona sin problemas:

¿Cuándo crear un Usuario Local y cuándo crear un Usuario Común?

Me parece importante entender cuándo es conveniente crear un usuario local y cuándo crear un usuario común.

Entiendo que habrá que tener varios factores en cuenta, pero lo que se dice en este video me deja algunas ideas rondando en la cabeza:

Desde el punto de vista de una aplicación, ésta [la PDB] es la base de datos. Desde el punto de vista de un DBA [Administrador de Base de Datos], la CDB es la base de datos.

Conclusión

Este error tiene una causa clara: surge cuando intentamos crear un usuario común (usuario de la CDB) sin respetar el formato exigido para el nombre de los usuarios comunes.

Entonces, no es necesario recurrir a un comando potencialmente problemático, porque el error deja de aparecer si definimos el nombre del usuario de forma adecuada:

  • creando un usuario común (en la CDB) con un nombre que comience con el COMMON_USER_PREFIX (c## ó C## por defecto).
  • o creando un usuario local (en la PDB), sin necesidad de incluir el prefijo en el nombre del usuario.

Recursos Adicionales

Tres recursos que recomiendo para informarse un poco más sobre CDB:

Brevísima definición + video

Material muy claro y completo

Introduction to the Multitenant Architecture

Categorizado en:

Etiquetado en: