必须先切换到目标PDB容器再创建用户;在CDB$ROOT下建用户默认为C##开头的CDB用户,而非PDB本地用户,且PDB本地用户不可带C##前缀,需在目标PDB中执行CREATE USER、指定本地表空间、显式授予并激活DEFAULT ROLE,最后通过服务名远程验证连接。

必须先切换到目标PDB容器,再执行 CREATE USER;直接在CDB$ROOT下建用户,默认是CDB用户(带C##前缀),不是PDB本地用户。
确认当前容器是目标PDB
在SQL*Plus或SQL Developer中,建用户前务必检查当前会话是否已进入目标PDB:
- 运行
show con_name—— 输出必须是类似ORCLPDB1,不能是CDB$ROOT - 若输出为
CDB$ROOT,需先执行alter session set container=ORCLPDB1;(把ORCLPDB1换成你的PDB名) - 注意:
show pdbs只显示所有PDB状态,不表示当前会话就在其中;必须用show con_name确认
执行 CREATE USER 时不加 C## 前缀
PDB本地用户的用户名不能带 C##,否则会被Oracle强制识别为CDB通用用户,后续无法通过PDB服务名远程登录:
- ✅ 正确:
CREATE USER myadmin IDENTIFIED BY "Secur3P@ss" DEFAULT TABLESPACE users; - ❌ 错误:
CREATE USER C##myadmin IDENTIFIED BY ...—— 即使在PDB内执行,也会报ORA-65094: invalid local user name - 表空间名必须是该PDB内已存在的(如
users、my_data),不能引用CDB级表空间路径
授权后必须显式启用默认角色
仅 GRANT DBA TO myadmin 不够,PDB本地用户需要手动激活角色,否则登录后无权限:
- 执行
GRANT CONNECT, RESOURCE, DBA TO myadmin; - 紧接着执行
ALTER USER myadmin DEFAULT ROLE CONNECT, DBA; - 漏掉这步会导致
conn myadmin/xxx@orclpdb1成功,但SELECT * FROM v$session;报ORA-00942: table or view does not exist
验证用户能否通过服务名远程连接
PDB本地用户不能用 sqlplus / as sysdba 切换过去,必须走TNS或Easy Connect:
- 确保监听器已加载该PDB服务:运行
lsnrctl status,输出中应含类似Service "ORCLPDB1" has 1 instance(s) - 测试连接:
sqlplus myadmin/"Secur3P@ss"@localhost:1521/ORCLPDB1 - 如果报
ORA-01017: invalid username/password,大概率是前面三步中某处没做对:容器没切、用户名加了C##、或默认角色没设
最容易被忽略的是 DEFAULT ROLE 这一步——它不像CDB用户那样自动继承,PDB本地用户必须显式声明,否则权限形同虚设。











