ORA-01031报错90%因漏授CREATE SESSION:Schema级权限不解决连接问题,必须显式授权;SQL中仍需HR.EMPLOYEES前缀;表必须真实归属HR schema;多schema需分别授权,不可用全局ANY TABLE。

ORA-01031 报错时,90% 不是权限没授全,而是漏了 CREATE SESSION
Schema 级权限本身不包含连接能力,GRANT SELECT ANY TABLE ON SCHEMA HR TO BOB 再完整,也换不来一次成功登录。Oracle 23c 已将 CONNECT 角色降权为仅含 CREATE SESSION,不再隐式带其他权限。所以必须显式执行:GRANT CREATE SESSION TO BOB。用连接池(如 HikariCP)时,更要确认 spring.datasource.username=BOB 对应的用户已具备该权限,而非靠 SYS 登录后切换。
SQL 中仍需显式写 HR.EMPLOYEES,不能依赖 currentSchema 参数
Oracle 不支持 JDBC URL 里的 ¤tSchema=HR 这类参数,会静默忽略。应用查不到数据,往往不是权限问题,而是 SQL 写成了 SELECT * FROM EMPLOYEES —— 此时查的是当前 session 默认 schema(即 BOB 用户自己的 schema),而非 HR 下的表。必须人工确保所有查询都带 schema 前缀:SELECT * FROM HR.EMPLOYEES。多 schema 场景下,这点无法绕过,也不能靠连接配置自动对齐。
GRANT SELECT ANY TABLE ON SCHEMA HR 只覆盖 HR 下的新建表,但表必须真在 HR 下
授权生效的前提是对象归属正确。常见错误:开发误在应用用户(如 APP_USER)下建了表,却指望 GRANT SELECT ANY TABLE ON SCHEMA HR TO APP_USER 能查到它。验证方法很简单:SELECT owner, object_name FROM all_objects WHERE object_type = 'TABLE' AND owner = 'HR'。若查不到,说明表压根不在 HR schema;刚建完就查,也可能因毫秒级权限缓存延迟失败,可先执行 SELECT 1 FROM DUAL 触发 session 刷新。
多 schema 场景下,不能靠一条 GRANT 打天下
一个应用要读 HR 和 FINANCE 两个 schema,必须拆成两条独立授权:GRANT SELECT ANY TABLE ON SCHEMA HR TO APP_USER + GRANT SELECT ANY TABLE ON SCHEMA FINANCE TO APP_USER。绝不可用 GRANT SELECT ANY TABLE TO APP_USER —— 它穿透所有 schema,23c 中已明确不推荐,且违反最小权限原则。如果还需写入,得退回到对象级授权,比如 GRANT INSERT, UPDATE ON HR.EMPLOYEES TO APP_USER,因为 23c 当前不支持 INSERT ANY TABLE ON SCHEMA。
Schema 级权限真正简化的是「对象访问范围管理」,但它对连接、SQL 写法、对象归属这三点毫无干预——而这三处恰恰是上线后最常出问题的地方。











