ora-01918 表示当前数据库上下文中查不到指定用户名,原因包括容器(cdb/pdb)错位、大小写不匹配、用户状态非open、权限缺失或导入时目标用户不存在。
ora-01918 不是“用户被删了”,而是你当前连接的数据库上下文里压根查不到那个用户名——拼写、大小写、容器(cdb/pdb)、状态,任一环节错位都会触发它。
确认当前连接的是 CDB 还是 PDB
Oracle 12c+ 默认启用多租户,dba_users 只返回当前容器中的用户。连在 CDB$ROOT 却去查一个只存在于 ORCLPDB 的用户,必然报 ORA-01918。
- 执行
SHOW CON_NAME看当前容器名 - 若返回
CDB$ROOT,而用户实际在 PDB 中,必须先切换:ALTER SESSION SET CONTAINER = ORCLPDB(把ORCLPDB换成你的 PDB 名) - 切换后再次
SHOW CON_NAME确认已生效 - 注意:普通用户无法切换容器,必须用
sqlplus / as sysdba或其他 DBA 权限账号登录
查用户前必须统一大小写并核对拼写
Oracle 默认将用户名转为大写存储,但应用配置若用了小写(如 scott)或混合写法,直接 WHERE username = 'scott' 就会查不到。
- 查用户请用:
SELECT username FROM dba_users WHERE username = UPPER('your_user') - 检查连接字符串里的
username参数:是否多空格、下划线错位、中英文冒号混用(比如用了中文:) - EF 等 ORM 默认尝试访问
dboschema,Oracle 没这个用户,必须显式设置:modelBuilder.HasDefaultSchema("YOUR_SCHEMA")(注意大小写,C# 区分大小写)
用户存在但 account_status 不是 OPEN
查到了用户,但状态是 LOCKED、EXPIRED 或 EXPIRED(GRACE),Oracle 仍拒绝连接,某些路径下就表现为“用户不存在”。
- 执行:
SELECT username, account_status FROM dba_users WHERE username = UPPER('YOUR_USER') - 若状态异常,先解锁:
ALTER USER YOUR_USER ACCOUNT UNLOCK - 再重置密码(必要时):
ALTER USER YOUR_USER IDENTIFIED BY newpass - 特别注意:12c+ 新建用户默认不带
CREATE SESSION权限,即使解锁也无法登录,需补授:GRANT CREATE SESSION TO YOUR_USER
impdp 导入时目标库缺用户
用 impdp 导入 dmp 文件,若文件里对象属于用户 A,但目标库没有用户 A,就会报 ORA-01918——不是脚本问题,是环境没准备好。
- 最稳妥做法:导入前先在目标库创建用户 A,配好表空间、配额、角色和权限
- 快速绕过方式:用
REMAP_SCHEMA=A:B把 A 的对象映射到已有用户 B 下(B必须存在且有对应权限) - 若还提示表空间不存在,加
REMAP_TABLESPACE=source:target
真正容易被忽略的点是:容器切换后权限未重验、大小写在 ORM 层被隐式处理、以及新版本(如 23ai)要求临时启用 _ORACLE_SCRIPT 才能运行 scott.sql 这类脚本——这些细节不手动验证,光看错误信息根本找不到入口。











