ora-01045错误表明用户缺少create session权限,需用sys/system执行grant create session to username(注意大小写),多租户环境下须先alter session set container=pdb_name再授权,并在对应pdb中验证。

ORA-01045不是密码错,是根本没被允许登录
这个错误明确告诉你:用户名密码是对的,账户也没锁,但 Oracle 连会话都不让你建——CREATE SESSION 权限压根没给。别去重置密码、解锁账户,那全是白忙。
用 sqlplus / as sysdba 直接授 CREATE SESSION
最稳的方式就是命令行一步到位:
- Linux/macOS 下执行:
sqlplus / as sysdba;Windows 或远程连接时用:sqlplus "sys/password as sysdba" - 执行授权:
GRANT CREATE SESSION TO poc_test;(注意大小写!如果建用户时用了双引号如"POC_TEST",这里也得写成"POC_TEST") - 不用
COMMIT—— 系统权限变更立即生效 - 验证是否成功:
SELECT PRIVILEGE FROM DBA_SYS_PRIVS WHERE GRANTEE = 'POC_TEST' AND PRIVILEGE = 'CREATE SESSION';,返回一行就说明成了
图形工具(PL/SQL Developer / Navicat)容易漏掉“Apply”
在 PL/SQL Developer 里右键用户 → Edit User → 切到 System Privileges 标签页 → 勾选 CREATE SESSION,这只是修改了 UI 缓存,不点 Apply 或 Save 按钮,权限根本没写进数据库。
Navicat 同样:编辑用户 → 服务器权限 → 勾选 CREATE SESSION → 必须点 保存(不是只点确定)。操作完建议仍用上面那条 SELECT 语句查一遍,别信 UI 界面显示。
多租户环境(CDB/PDB)下必须先切容器再授权
Oracle 12c+ 启用多租户后,GRANT 必须在目标 PDB 内执行,否则权限只落在 CDB$ROOT,对 PDB 用户无效:
- 连上后先查当前容器:
SHOW CON_NAME - 如果显示
CDB$ROOT,执行:ALTER SESSION SET CONTAINER = pdb_name;(把pdb_name换成实际名) - 再跑
GRANT CREATE SESSION TO poc_test; - 查权限也得在同一个 PDB 里查:
SELECT ... FROM DBA_SYS_PRIVS,否则查不到
混淆 CDB 和 PDB 上下文,是权限看似“授了却没用”的最常见原因。











