ORA-01031 连接失败主因是未授予 CREATE SESSION 权限;Oracle 23c 中 CONNECT 角色已降权,须显式执行 GRANT CREATE SESSION TO BOB;Schema 级权限不自动继承新对象,需手动补授。

ORA-01031 连不上?先确认 CREATE SESSION 是否已显式授予
Schema 级权限(如 GRANT SELECT ANY TABLE ON SCHEMA HR TO BOB)只管“能查什么”,不管“能不能连进来”。90% 的连接失败不是授权漏了对象,而是根本没给登录权。
Oracle 23c 中 CONNECT 角色已被降权,仅含 CREATE SESSION,但依然建议直授更清晰:
-
GRANT CREATE SESSION TO BOB—— 必须执行,不可省略 - 不要依赖旧习惯认为
GRANT CONNECT TO BOB就够了,它现在只是个空壳角色 - 若用 HikariCP 或其他连接池,检查
spring.datasource.username对应的用户(如BOB)是否已具备该权限,而非靠SYS登录后切换
SQL 中仍需显式写 schema 前缀,currentSchema 参数无效
Schema 级权限不会改变当前 session 的默认 schema。BOB 用户的默认 schema 永远是 BOB,不是你刚授权的 HR。所以 Java 里写 SELECT * FROM EMPLOYEES 会去查 BOB.EMPLOYEES,而不是 HR.EMPLOYEES。
常见错误操作:
- 在 JDBC URL 里加
¤tSchema=HR—— Oracle 不支持该参数,会静默忽略 - 期望授权后自动识别
HR为默认 schema —— 23c 不提供该行为,也不支持 ALTER SESSION SET CURRENT_SCHEMA 在连接池场景下可靠生效 - 代码中漏掉前缀,又没建同义词或视图 —— 直接报
ORA-00942: table or view does not exist
多 schema 场景必须分拆授权,不能靠 ANY 权限一招通吃
一个应用要同时读 HR 和 FINANCE 两个 schema,就必须分别授权:
GRANT SELECT ANY TABLE ON SCHEMA HR TO APP_USERGRANT SELECT ANY TABLE ON SCHEMA FINANCE TO APP_USER
绝对禁止使用 GRANT SELECT ANY TABLE TO APP_USER —— 它穿透所有 schema,23c 中已明确不推荐,且违反最小权限原则。另外注意:
- 新表必须确实在目标 schema 下:执行
SELECT owner, object_name FROM all_objects WHERE object_type = 'TABLE' AND owner = 'HR'核对,别误建在APP_USER下 - 授权后立刻查询可能遇毫秒级缓存延迟,加一句
SELECT 1 FROM DUAL可触发刷新(非必需,但可排除缓存干扰)
Schema 级权限不自动覆盖未来新建对象?得靠 DBA 主动维护
和 PostgreSQL 的 ALTER DEFAULT PRIVILEGES 不同,Oracle 23c 的 Schema 级权限目前**不自动继承给后续新建表**。也就是说,DBA 授完 ON SCHEMA HR 后,如果开发 later 新建了一张 HR.SALARY_LOG,它不会自动获得授权。
目前唯一可靠做法是:
- 要求建表人在
HRschema 下执行CREATE TABLE ...后,立即补一句GRANT SELECT ON HR.SALARY_LOG TO APP_USER - 或由 DBA 定期扫描
DBA_OBJECTS中未授权的新表,批量补授 - 不能指望“一次授权、永久有效”——这是最容易被忽略的限制点


















