ora-01045错误本质是用户缺少create session权限,需由sys/system等高权限用户执行grant create session to poc_test;或grant connect to poc_test;授权,且须注意大小写、容器上下文及图形界面中的“apply”操作。
ora-01045错误本质是权限缺失,不是密码或账户锁定问题
这个错误明确告诉你:用户能连上监听,也能通过认证(密码正确、账户未锁定),但 oracle 拒绝建立会话,因为 create session 权限根本没给。它和 ora-01017(用户名/密码错误)、ora-28000(账户锁定)是不同层级的问题,别浪费时间重置密码或解锁账户。
用SYS或SYSTEM执行GRANT CREATE SESSION是最直接解法
必须由具备 GRANT ANY PRIVILEGE 或 DBA 角色的用户来授权,通常就是 SYS 或 SYSTEM。其他普通 DBA 用户如果没被显式授过该能力,也会报 ORA-01031: insufficient privileges。
- 先以管理员身份登录:
sqlplus / as sysdba或sqlplus system/password@db - 执行授权语句:
GRANT CREATE SESSION TO poc_test;(注意:用户名大小写敏感,若创建时用了双引号如"POC_TEST",这里也得保持一致) - 不需要 COMMIT —— 权限变更立即生效
- 验证是否成功:
SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE = 'POC_TEST' AND PRIVILEGE = 'CREATE SESSION';
CONNECT角色能替代CREATE SESSION,但要注意隐含依赖
CONNECT 是 Oracle 自带的角色,Oracle 12c 及以后版本中默认只包含 CREATE SESSION,但早期版本(如 10g)还附带 CREATE TABLE 等多余权限。如果你只是想让用户能登录,用角色更简洁:
GRANT CONNECT TO poc_test;- 但要注意:如果该用户之前被显式
REVOKE过CREATE SESSION,即使有CONNECT角色,权限也不会自动恢复 —— Oracle 的权限模型是“显式拒绝 > 角色授予” - 检查角色是否启用:
SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTEE = 'POC_TEST' AND GRANTED_ROLE = 'CONNECT';
PL/SQL Developer 或 OEM 图形界面操作容易漏掉“应用”步骤
在 PL/SQL Developer 中右键用户 → “Edit User” → 切到 “System Privileges” 标签页 → 勾选 CREATE SESSION → 点击 “OK” 后,**必须再点一次“Apply”或“Save”按钮**(不同版本 UI 位置略有差异)。只点 OK 不保存权限是常见疏忽,操作后建议仍用 SQL 查一下 DBA_SYS_PRIVS 确认。
另外,如果数据库启用了 Oracle Data Guard 或多租户(CDB/PDB),要确认当前连接的是正确的容器:在 PDB 中授的权限,在 CDB$ROOT 里查不到;反之亦然。执行前先运行 SHOW CON_NAME 看清上下文。











