oracle代理授权必须以被代理用户为主语,如alter user zlhis grant connect through u1118;验证需查proxy_users视图;登录用u1118[zlhis]格式并填u1118密码;溯源唯一可信字段是sys_context('userenv','authenticated_identity')。

ALTER USER ... GRANT CONNECT THROUGH 语法必须写对主体顺序
代理授权不是“给代理用户赋权”,而是“被代理用户主动授权”。常见错误是把 ALTER USER 的主语搞反:写成 ALTER USER proxy_user GRANT CONNECT THROUGH target_user,这会直接报错 ORA-01937: missing or invalid role name。正确写法必须以被代理用户(如 ZLHIS)为主语:ALTER USER ZLHIS GRANT CONNECT THROUGH U1118。Oracle 从 10gR2 起就严格要求这个语序,所有版本(包括 19c、21c)都一致。
验证代理关系是否生效,别只查 USER 视图
SELECT USER FROM DUAL 登录后永远显示被代理用户(如 ZLHIS),这不能说明代理配置成功。真正有效的验证方式是查 PROXY_USERS 视图:SELECT * FROM PROXY_USERS WHERE CLIENT = 'U1118' AND PROXY = 'ZLHIS'。有结果才代表授权已加载进内存;如果没结果,可能是授权未提交、连接用了错误的 service_name,或用户不在当前容器(CDB/PDB)中。注意:该视图不跨 PDB,且撤销后立即清空,不缓存。
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
登录时用方括号语法,密码仍是代理用户的
客户端连接字符串里,代理用户和被代理用户用方括号拼接:U1118[ZLHIS],但密码必须填 U1118 的密码,不是 ZLHIS 的。例如 sqlplus 命令:sqlplus U1118[ZLHIS]/password123@orcl。OBClient、JDBC URL(需启用 oracle.jdbc.proxyClientName)、甚至 OCI 都支持这种格式。漏掉方括号或写成圆括号都会导致直连,权限完全失效。
AUTHENTICATED_IDENTITY 是唯一可信的真实身份源
代理登录后,USER、SESSION_USER、PROXY_USER 全部返回被代理用户,只有 SYS_CONTEXT('USERENV', 'AUTHENTICATED_IDENTITY') 返回原始登录账号(如 U1118)。这个值由 Oracle 内核在认证阶段写入,不可伪造、不依赖应用层设置。审计日志(DBA_AUDIT_TRAIL)里的 OS_USERNAME 和 CLIENT_ID 可能被中间件篡改,但 AUTHENTICATED_IDENTITY 是权限控制与溯源的黄金字段——尤其在排查越权操作时,它比任何日志字段都可靠。










