ORA-01045错误源于用户缺少CREATE SESSION权限,需用SYS/SYSTEM执行GRANT CREATE SESSION TO username(注意大小写),权限立即生效;多租户环境下必须先ALTER SESSION SET CONTAINER=pdb_name再授权,且验证须在对应容器中查询DBA_SYS_PRIVS。
ora-01045 不是密码错、不是账户锁,而是用户根本没被允许“坐到数据库这张桌子旁”——create session 权限缺失,必须补上才能登录。
用 SQL*Plus 或 sqlplus / as sysdba 授权最可靠
图形工具(如 PL/SQL Developer、Navicat)点完“勾选 CREATE SESSION”后常忘记点 Apply 或 Save,权限实际没生效。直接走命令行,一步到位:
- 先以管理员身份连入:
sqlplus / as sysdba(Linux/macOS)或sqlplus "sys/password as sysdba"(Windows 或远程) - 执行授权:
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'; 返回一行即表示已授。
用 CONNECT 角色代替 CREATE SESSION 要小心隐含限制
CONNECT 角色在 Oracle 12c+ 默认只含 CREATE SESSION,看起来更简洁,但容易踩坑:
- 执行
GRANT CONNECT TO poc_test;可以替代单独授CREATE SESSION - 但如果该用户之前被显式执行过
REVOKE CREATE SESSION FROM poc_test;,哪怕有CONNECT角色,CREATE SESSION也不会恢复 —— Oracle 权限模型中,“显式撤销”优先级高于角色授予 - 检查角色是否真正生效:
SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTEE = 'POC_TEST' AND GRANTED_ROLE = 'CONNECT';确保ADMIN_OPTION和DEFAULT_ROLE列值合理(通常为NO和YES)
多租户环境(CDB/PDB)下必须确认当前容器
Oracle 12c+ 启用多租户后,GRANT 必须在目标 PDB 内执行,否则权限只存在于 CDB$ROOT,对 PDB 用户无效:
- 登录后先查当前容器:
SHOW CON_NAME - 如果显示
CDB$ROOT,需先切换:ALTER SESSION SET CONTAINER = pdb_name;(把pdb_name换成实际 PDB 名) - 再执行
GRANT CREATE SESSION TO poc_test; - 注意:
DBA_SYS_PRIVS视图在 CDB 和 PDB 中可见范围不同,查权限务必在对应容器里查
别把 CREATE SESSION 和 RESOURCE 混着授,除非真需要
很多教程一并写 GRANT CONNECT, RESOURCE TO poc_test;,但 RESOURCE 在新版本中默认包含 UNLIMITED TABLESPACE 和大量对象创建权限(如 CREATE PROCEDURE),对仅需登录的测试用户属于过度授权:
- 最小化原则:只授
CREATE SESSION,够用就行 - 如果后续要建表/过程,再按需追加:
GRANT CREATE TABLE, CREATE PROCEDURE TO poc_test; -
RESOURCE角色在 Oracle 23c 已标记为 legacy,官方建议拆解使用
权限这事,补得快不如补得准;尤其在生产库,漏掉容器上下文或误授 RESOURCE,后面排查会比加权限花十倍时间。


















