修复:Oracle 别名字段补全和 DIP 用户显示#4075
Conversation
t8y2
left a comment
There was a problem hiding this comment.
request changes: 还有一个 Oracle schema 兼容性问题需要处理。
apps/desktop/src/stores/connectionStore.ts:4786 在未传入 schema 时固定使用连接配置中的登录用户名。但 Oracle 的 CURRENT_SCHEMA 可以通过 ALTER SESSION SET CURRENT_SCHEMA 与登录用户不同;此时未限定对象名实际解析到当前 schema,而 DBX 会向 ALL_TAB_COLUMNS 查询错误的 owner,导致别名字段补全漏项。
“changes the current schema of the session”
“may also change during the duration of a session”
建议在 agent 或连接元数据层读取 SYS_CONTEXT('USERENV','CURRENT_SCHEMA'),仅在无法读取时回退到配置用户名,并补充登录用户与 CURRENT_SCHEMA 不同的回归测试。
e24733a to
9002ea7
Compare
|
已按审核建议调整,感谢指出这个兼容性问题。
另外已在 Oracle 11g 实测:以 验证已通过: |
t8y2
left a comment
There was a problem hiding this comment.
request changes: 之前的 CURRENT_SCHEMA blocker 还没有端到端解决。
apps/desktop/src/stores/connectionStore.ts:4818 的空 schema 补全仍走不带当前 tab clientSessionId 的 metadata API。查询编辑器在 apps/desktop/src/stores/queryStore.ts:3365 使用 tab-scoped session,而 core completion 在 crates/dbx-core/src/schema.rs:3582 使用 base metadata pool。
Oracle 11g 实测:tab 执行 ALTER SESSION SET CURRENT_SCHEMA = DBX 后,tab session 的 CURRENT_SCHEMA 是 DBX,但 metadata session 仍是 SYSTEM。因此未限定 schema 的别名字段补全仍可能查询错误 owner。
Oracle 文档也明确说明 ALTER SESSION 修改的是当前 session 的 schema:
https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/ALTER-SESSION.html
“changes the current schema of the session”
请让补全请求使用与当前 SQL tab/transaction 相同的 execution session,或显式同步并传递该 execution context 的 current schema;同时按 session/current schema 隔离或失效 completion cache。
建议补一个双 schema 同名表的端到端回归测试,验证切换 CURRENT_SCHEMA 后补全字段立即切换,并覆盖缓存命中、显式 schema、切换回来和独立 tab。
9002ea7 to
2937a42
Compare
|
已按本轮审核意见完成端到端修复,更新提交: 处理内容:
Oracle 11g 使用两个 schema 的同名表做了真实验证:
自动化验证通过: |
|
@t8y2 本轮审核意见已处理完毕,相关实现、双 schema 同名表实测结果和自动化验证已在上一条评论中说明,当前 CI 已全部通过。麻烦再审核一下,谢谢。 |
|
Thanks for the contribution! Merged in 25e799c, will be released in the next version. |
改动
ALTER SESSION SET CURRENT_SCHEMA后读取实际当前模式CURRENT_SCHEMA或重置会话后立即失效本地缓存,避免跨标签页、跨模式复用旧字段SCHEMA.TABLE继续保留原有共享元数据路径SYS_CONTEXT('USERENV', 'CURRENT_SCHEMA'),失败或为空时回退SESSION_USERDIP的实际用户,并更新模式树缓存版本验证
pnpm checkpnpm buildcargo check -p dbx-core -p dbx-webgo test ./...(agents/drivers/oracle-go)