报错:【ORA-65096: 公用用户名或角色名无效】
查询数据库版本
SELECT * FROM v$version ;
BANNER CON_ID
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production 0
PL/SQL Release 12.2.0.1.0 - Production 0
CORE 12.2.0.1.0 Production 0
TNS for 64-bit Windows: Version 12.2.0.1.0 - Production 0
NLSRTL Version 12.2.0.1.0 - Production 0
创建用户失败
create user lingd identified by 123456; // ORA-65096: 公用用户名或角色名无效
查询官方文档得知,这是oracle_12
版本的特性,有兴趣的朋友可以查阅下 官方文档
在CDB容器中用户名必须加c##
前缀才能创建成功:
create user c##lingd identifed by 123456;
grant connect, resource to c##lingd; // 用户授权
查看用户
select username, user_id, account_status from dba_users where username like '%LINGD%';
如果这样能解决你的问题那么到此处就可以结束了 (●’◡’●)
但是楼主的问题还没得到解决 ( ╯□╰ )
由于我在使用Go
语言开发项目时,连接C##
开头的用户总是无法连接成功,但是用Java
项目连接C##
的用户就没问题。
由于时间紧急,Go
连接C##
开头的用户失败的问题暂时搁置…
所以迫使我必须创建不带C##
的用户,于是就有了下面的操作
查看当前容器
select sys_context('USERENV','CON_NAME') from dual; // CDB$ROOT
查看所有容器
select con_id, dbid, name, open_mode from v$pdbs;
查询结果
CON_ID DBID NAME OPEN_MODE
---------- ---------- ---------- ----------
2 2159055928 PDB$SEED READ ONLY
3 3019652274 ORACLEDB MOUNTED
切换容器
alter pluggable database ORACLEDB open;
再次查看容器状态
select con_id, dbid, name, open_mode from v$pdbs;
查询结果:ORACLEDB 变成了 READ WRITE
CON_ID DBID NAME OPEN_MODE
---------- ---------- ---------- ----------
2 2159055928 PDB$SEED READ ONLY
3 3019652274 ORACLEDB READ WRITE
修改会话的容器
alter session set container=ORACLEDB; // 一定要先执行上面的“切换容器”SQL语句
再次创建用户
create user lingd identified by 123456;
grant connect, resource to lingd;
注意:在使用新用户
lingd
登录时,服务名或SID需调整为你的容器名ORACLEDB
,否则会提示用户不存在
再次查看用户
select username, user_id, account_status from dba_users where username like '%LINGD%';
如何默认启动PDB?
使用SYS用户创建如下触发器即可:
sqlplus / as sysdba
CREATE TRIGGER open_all_pdbs
AFTER STARTUP
ON DATABASE
BEGIN
EXECUTE IMMEDIATE 'alter pluggable database all open';
END open_all_pdbs;
/