ORA-01045错误本质是用户缺少CREATE SESSION权限,必须由SYS/SYSTEM等高权限用户显式执行GRANT CREATE SESSION TO abc;授权,注意大小写敏感、容器上下文及图形界面中“Apply”操作。

ORA-01045 不是密码错、也不是账户锁,就是没给登录资格 —— 必须显式授予 CREATE SESSION 权限才能连上。
用 SYS 或 SYSTEM 执行 GRANT CREATE SESSION
这个权限不能靠“默认”或“继承”获得,必须由高权限用户手动授予。常见错误是用普通 DBA 用户去授,结果报 ORA-01031: insufficient privileges。
- 先以管理员身份登录:
sqlplus / as sysdba或sqlplus system/password@orcl - 执行授权语句:
GRANT CREATE SESSION TO abc;(注意:如果创建用户时用了双引号如"ABC",这里也得写成"ABC") - 不需要
COMMIT—— 权限变更立即生效 - 验证是否成功:
SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE = 'ABC' AND PRIVILEGE = 'CREATE SESSION';
用 CONNECT 角色替代,但要注意版本和显式拒绝
CONNECT 角色在 Oracle 12c 及以后只含 CREATE SESSION,看起来更简洁,但它不是万能保险。
- 执行:
GRANT CONNECT TO abc; - 但如果之前执行过
REVOKE CREATE SESSION FROM abc;,哪怕CONNECT已授予,登录仍失败 —— Oracle 的权限模型中,“显式拒绝”优先级高于角色授予 - 检查角色是否真正启用:
SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTEE = 'ABC' AND GRANTED_ROLE = 'CONNECT'; - 别混淆
CONNECT和旧版的RESOURCE:后者附带建表等权限,非必需;仅登录只需前者
图形界面操作(PL/SQL Developer、Navicat)容易漏“保存”
点完勾选就关窗口,权限根本没写进数据库 —— 这是高频疏忽。
- 在 PL/SQL Developer 中:右键用户 → Edit User → System Privileges 标签页 → 勾选
CREATE SESSION→ 点OK后,**必须再点一次Apply或Save**(不同版本按钮名略有差异) - 在 Navicat for Oracle 中:用户 → 编辑用户 → 服务器权限选项卡 → 勾选
CREATE SESSION→ 点击保存 - 操作后务必用 SQL 查
DBA_SYS_PRIVS确认,别信 UI 显示
多租户(CDB/PDB)环境下权限作用域容易错
在 Oracle 19c 多租户架构中,CREATE SESSION 权限必须在目标 PDB 内授予,否则在 CDB$ROOT 里授了也没用。
- 连接前先确认容器:
SHOW CON_NAME; - 如果用户要连的是
PDBORCL,就得先ALTER SESSION SET CONTAINER = PDBORCL;,再执行GRANT CREATE SESSION TO abc; - 在 CDB$ROOT 中查
DBA_SYS_PRIVS看不到 PDB 内授的权限,反之亦然 - OceanBase Oracle 模式同理:权限必须在对应租户内授予
最常被忽略的是大小写敏感性和容器上下文 —— 尤其当用户名带双引号、或数据库启用了多租户时,错一点就白操作一次。


















