一、问题

今天在创建Oracle用户时,报错:【ORA-65096: 公用用户名或角色名无效】

ORA-65096: 公用用户名或角色名无效_oracle用户登录

什么原因呢?

查看数据库版本信息:

select version from v$instance;
  • 1.

我的oracle版本是19c,应该是oracle_12版本及以上版本的特性

在CDB容器中用户名必须加c##或者C##前缀才能创建成功,但会改变用户名的预期格式

Oracle官方文档介绍: https://docs.oracle.com/database/121/DBSEG/users.htm#DBSEG99780

ORA-65096: 公用用户名或角色名无效_oracle用户登录_02

这里面又牵扯到了容器CDB(Container Database)PDB(Pluggable Database)的概念,具体大家可以自己深究,这英文文档也看不懂

二、解决

方案一、直接创建以c##或者C##开头的用户

当前容器为CDB,CDB容器下创建用户必须以c##或者C##开头,那就改下用户名呗,仅仅是个用户名而已,也不影响什么

方案二、将当前容器改为PDB,然后再创建用户

将当前容器改为PDB,PDB容器创建用户无需以c##或者C##开头

使用sys用户进行操作,其他用户权限级别不足

查询容器是否CDB

select name,cdb,open_mode,con_id from v$database;
  • 1.

ORA-65096: 公用用户名或角色名无效_oracle用户登录_03

查看当前容器名称

show con_name;
  • 1.


ORA-65096: 公用用户名或角色名无效_oracle_04

查看已经创建的pdb容器

show pdbs;
  • 1.

ORA-65096: 公用用户名或角色名无效_ORA-65096_05

打开上述ORCLPDB容器

ALTER PLUGGABLE DATABASE ORCLPDB OPEN;
  • 1.

ORA-65096: 公用用户名或角色名无效_ORA-65096_06

将当前容器切换到指定的PDB容器中,可插拔数据库(PDB)

alter session set CONTAINER=ORCLPDB;
  • 1.

ORA-65096: 公用用户名或角色名无效_oracle用户登录_07

查看当前容器,会发现以及切换到ORCLPDB的容器了

show con_name;
  • 1.

ORA-65096: 公用用户名或角色名无效_oracle用户登录_08

就可以正常创建用户了

CREATE USER ROOTUSER1 IDENTIFIED BY ROOTUSER;
  • 1.

ORA-65096: 公用用户名或角色名无效_oracle用户登录_09

查看用户是否创建成功

select username from dba_users where username = 'ROOTUSER1';
  • 1.

授予用户权限

创建用户后,需要授予用户执行数据库操作的权限。通常,会授予用户如CREATE SESSIONCREATE TABLECREATE VIEW等基本权限,以及根据需要授予更高级的权限。例如:

GRANT CONNECT, RESOURCE TO 用户名;
-- 注意:DBA权限应谨慎授予,因为它提供了对数据库的广泛控制权
-- GRANT DBA TO 用户名; (仅在必要时授予)
  • 1.
  • 2.
  • 3.

使用新创建的用户进行登录

不知道为什么,这个用户无法以普通用户登录,必须以超级管理员 sysdba进行登录才行 

ORA-65096: 公用用户名或角色名无效_ORA-65096_10

而使用超级管理员登录后,虽然密码输入的是刚新的的用户的密码,但登陆的不是刚创建的用户,而是sys用户

ORA-65096: 公用用户名或角色名无效_oracle用户登录_11

新创建的用户普通登录请查看文章:oracle 12c及以上 解决pdb中用户无法普通登录问题