ora-01045 是因缺少 create session 权限导致的会话拒绝,需用 sys/system 执行 grant create session to poc_test; 或 grant connect to poc_test; 并验证 dba_sys_privs 或 dba_role_privs。

ORA-01045 是权限问题,不是密码或账户锁定
这个错误明确表示:用户能通过监听、密码也正确、账户也没被锁,但 Oracle 拒绝建立会话,因为 CREATE SESSION 权限根本没给。它和 ORA-01017(用户名/密码错误)、ORA-28000(账户锁定)是完全不同的问题层级。别花时间重置密码或执行 ALTER USER ... ACCOUNT UNLOCK —— 那些操作对 ORA-01045 无效。
必须由 SYS 或 SYSTEM 执行 GRANT CREATE SESSION
普通 DBA 用户如果没有被显式授予 GRANT ANY PRIVILEGE,执行授权时会报 ORA-01031: insufficient privileges。所以最可靠的方式是:
- 用
sqlplus / as sysdba或sqlplus system/password@db登录 - 执行
GRANT CREATE SESSION TO poc_test;(注意大小写:如果建用户时用了双引号如"POC_TEST",这里也得写成"POC_TEST") - 不需要
COMMIT—— 权限变更立即生效
验证是否成功:运行 SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE = 'POC_TEST' AND PRIVILEGE = 'CREATE SESSION';,有结果才说明真授上了。
CONNECT 角色可以替代 CREATE SESSION,但有隐含条件
CONNECT 是 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 / Navicat)容易漏掉“Apply”
在 PL/SQL Developer 中右键用户 → Edit User → 切到 “System Privileges” 标签页 → 勾选 CREATE SESSION → 点击 OK 后,**必须再点一次 Apply 或 Save**。不同版本 UI 位置略有差异,只点 OK 不保存权限是高频疏忽。操作后仍建议用 SQL 查 DBA_SYS_PRIVS 确认,别信界面上的勾选状态。
另外,如果数据库启用了多租户(CDB/PDB),要先确认当前连接的是正确的容器:SHOW CON_NAME。在 PDB 中授的权限,在 CDB$ROOT 里查不到;反之亦然。











