Files
dbx/docs/testing/oceanbase-view-rename.md

91 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# OceanBase Oracle 普通视图改名验收
本次验收覆盖侧栏和对象浏览器的普通视图改名、同属主静态视图依赖同步,以及打开的源码草稿保护。基线为 `188b94ece23c44a40515915bbf2048cf211a98dd`。数据库为 OceanBase 4.2.5.7 Oracle 模式,产品入口使用 OceanBase Connector/J 2.4.19;验收于 2026-10-13 完成。
## 问题现象
原入口仅开放 OceanBase Oracle 表改名。普通视图可以执行不带属主的 `RENAME`,但直接改名会让原名称引用的依赖视图失效。旧源码编辑上下文还可能按原名称保存,重新创建旧对象。
## 复现与修复验证
操作入口:在侧栏或对象浏览器的普通视图上右键,选择「结构工具 → 重命名」。侧栏选中视图后也可按 F2。填写新名,核对依赖 SQL 预览后确认。
![视图改名菜单入口](oceanbase-view-rename-entry.png)
在隔离属主下创建根视图和两级依赖,根视图包含带引号的列别名与 `WITH READ ONLY`,三个视图均授予另一隔离账号 `SELECT WITH GRANT OPTION`。
1. 从侧栏的「结构工具 → 重命名」将根视图改为带空格和混合大小写的引号名称。预览列出根视图 `RENAME`、直接依赖引用改写和间接依赖原定义重建。
2. 从对象浏览器将根视图再次改名,并保留一个未保存的旧名称源码草稿。
3. 通过产品 Agent 读回:旧名称消失,三个视图均为 `VALID`,列别名、只读属性和三项 `SELECT WITH GRANT OPTION` 保留,隔离视图查询结果均为 42。
4. 保存旧草稿被身份检查阻断;草稿内容保留,数据库中的定义及值不变。
![对象浏览器改名后保留旧稿并阻断保存](oceanbase-view-rename-draft-guard.png)
生产函数及组件测试覆盖取消、目标切换、依赖图变化、截断元数据、权限降级、两级重建、部分失败、响应未知、并发 hint 修改及迟到源码加载。Rust 改写测试覆盖引号名称、属主、alias、CTE、文本保真,以及当前或后续 CTE 捕获新名称的前置拒绝。
## 执行边界
自动处理范围为当前账号可见、同属主、可安全解析的普通视图依赖。预览明确披露:不可见的跨属主依赖、动态 SQL 和应用引用不会迁移,改名后可能失效。查询成功或零行不证明全库无依赖,也不要求所有用户具有 DBA 权限。
可确认的引用由系统自动改写。某个 hint 或定义无法安全改写时,改名弹框仍保留其余对象的预览,并显示问题对象、hint 原文及可得行列;用户可在同一弹框修正改名前定义并点击“重新校验”。校验会重新检查声明、引用绑定、依赖拓扑和目标身份,通过后才启用原确认按钮。问题未修正时按钮保持禁用,不会派发 DDL。跨属主、非视图、循环或定义/依赖元数据不完整属于当前不可由编辑 SQL 解除的问题,界面会说明原因并要求处理对象或重新读取计划。执行前重新核对目标、定义、依赖及授权;每个依赖覆盖前再比较完整原定义和授权。首错停止并保留原定义和已确认步骤,不执行自动回滚。
源码冻结和保存互斥作用于同一前端实例。其他实例的修改通过元数据复核检测,DDL 执行不具备跨实例原子性。旧只读数据标签保留原名称和结果,需要刷新或重新打开。
## 检查结果与缺口
- 7 个前端测试文件的 53 项测试、类型检查、改动文件格式与 lint 通过;包含中文旧稿保护提示回归。
- Rust 改写 13 项定向测试、SQL Core 全库测试和 Clippy 通过;Web 前后端构建通过。
- 9 个要求的语言包新增键齐备;离线 i18n dry-run 无待补译文件。
- 架构检查在临时将 DuckDB 锁文件换行规范为 LF 后 28 项通过,随后恢复原文件。原 Windows CRLF 工作副本触发既有检查脚本的分隔符解析失败,未计为原命令通过;连接类型生成检查通过。
- 两处 Web GUI 入口和产品 Agent 实库读回通过,隔离对象完成精确清理和读回。
- 原生 Oracle 实库测试获准暂缓;本次结果不能作为原生 Oracle 验收证据。
- Windows 原生桌面构建未执行;Web GUI 不替代原生桌面验收。
- 本文原验收对应的普通视图改名保持上述基线范围。PR50 在 2026-10-14 增加表、例程改名和包另存为修复:Oracle 表列级授权按 `TABLE_SCHEMA` 查询,OceanBase Oracle 保留 `OWNER`;例程和包来源改写失败时保留源草稿并允许重新校验。
- PR50 本轮定向前端测试 7 个文件 96 项通过。SidebarTreeRuntimeHost 组件宿主测试 4 项验证 routine/package 草稿与校验入口透传、原生 Oracle routine prepare 路径、同目标取消后重开保留草稿及目标切换清稿;routine/package 人工修正后重新 prepare 并成功 execute 的 2 项定向测试通过。Rust `oracle_` 测试 103 项通过,包含 strict validator 对 owner/name/type、单 PL/SQL 单元、裸声明和 quoted mixed-case identity 的检查。定向 oxlint 退出码为 0,只有 ObjectBrowser.vue:3387 与 SidebarTreeRuntimeHost.vue:5426 的既有 `no-ex-assign` 告警;`git diff --check` 通过。
- Oracle package 源码写入前通过既有 executable-source builder 校验生成的 spec/body;native Oracle routine caller 草稿在 rename 专用 validator 中校验 owner、name、type 和完整 PL/SQL 边界,并经 Tauri/Web 两条 backend 传输注册。routine rename caller view 在 prepare、替换后读回及删除旧 routine 前复用 Oracle view review API,拒绝声明名不匹配的 `CREATE OR REPLACE VIEW` 草稿;一般 view builder 对裸查询的契约未改。侧栏与 ObjectBrowser 的 routine draft 生命周期及编辑后旧 SQL 隐藏已补修。PR50 两入口 Web GUI 与 OceanBase Oracle 实库验收由主会话继续完成;本轮没有执行 Oracle DDL。原生 Oracle 实库测试继续暂缓,不计为通过。
## 2026-10-14 人工草稿流程增量验收
本段运行证据对应源码 `0ee2d78df50727c09a0bdecb083c373d29e5b2d3`,Web 后端 SHA-256 为 `4DF1CB1DA6CAFC8D4424F4FCFC67B97108B216C15B90750AB16B4BF9B902555F`。最终类型检查、Web 前端及 GNU 后端构建通过;复用 OceanBase 4.2.5.7 Oracle 模式、Connector/J 2.4.19 和 Agent 0.1.77。以下操作仅涉及本轮隔离对象,未执行过程或包内例程。
- 侧栏过程改名弹窗正常加载。手动修改调用方源码后,旧 SQL 预览隐藏、确认按钮禁用;重新校验后生成两处指向新名称的静态调用。确认改名后,旧过程不存在,新过程及调用方均为 `VALID`。
- 对象浏览器的包另存为正确拒绝包体中的动态旧名称引用,同时保留已生成的包规格 SQL 和可编辑包体。将包体改为静态调用后重新校验,创建新包及包体成功,原包及包体保留。
- 经产品查询入口读回,本轮六个对象均为 `VALID`,旧过程数量为 0,`USER_ERRORS` 编译错误数量为 0。隔离对象尚未清理,待例程守卫补丁复验后统一精确清理。
- GUI 同时发现例程调用方混合静态旧名调用与 `EXECUTE IMMEDIATE` 时,重写器只改静态调用,仍允许残留动态旧引用。实际执行前已人工删除该动态引用;生产 Rust 入口已复现失败测试,守卫补丁与最终产物复验待完成。本段成功证据不代表该遗漏已修复。
![包人工修正后生成预览](oracle-package-manual-preview.jpg)
原生 Oracle 实库继续获准暂缓;Web GUI 不替代原生桌面验收。本批同时补齐基线 HANA `column_data_type` 调用缺失的参数,使当前 Web 构建可执行。docs-export 构建发现基线依赖生成漂移;相关输入没有本次改动,因此保留基线产物,不将无关生成差异带入本批。
### 动态守卫复验与写后比较缺口
候选 `6399de7d6a5ad18629bc3cfc0f52aa88ec3d95fb` 的 GNU 后端构建通过,运行文件 SHA-256 为 `AF6F7BC7D4C1532A99D1CA107703ED0AB242E5CA0E9B5D1F082A06CC6D979D6A`。107 项 Rust 测试、25 项相关前端测试、Clippy 及窄增量双维审查通过。
- 修复产物在 GUI 中正确阻断混合静态调用与 `EXECUTE IMMEDIATE`,返回行列位置;调用方草稿保留,确认禁用。人工改成两次静态调用后,取消并重开同一目标仍保留单行草稿,重新校验成功。
- 执行后创建目标过程及替换调用方成功,但 OceanBase 读回定义在声明名、`IS`、`BEGIN` 之间插入换行,当前逐字源码比较误报不一致。通过产品查询入口读回确认调用方已含两处正确目标调用;七个隔离对象均为 `VALID`,旧过程仍保留。该执行为部分成功,不计整条重命名通过,也未自动重试或回滚。
- 已用真实 prepare/execute 入口和仅模拟外部数据库格式化的回归测试复现红灯;保守源码指纹修复与最终 GUI 复验待完成。
![例程动态 SQL 被阻断并保留人工草稿](oracle-routine-manual-guard.jpg)
### 写后指纹修复候选
`cb9e8ceb7087a193cca70acbab31d89498ec031c` 已补齐根例程写后、调用方写后和 DROP 前的保守 token 指纹比较,原始元数据快照仍精确比较。50 项前端定向测试、110 项 Rust 定向测试及增量双维独立审查通过;前端生产构建和 GNU Web 后端构建退出码均为 0。后端 SHA-256 为 `9DB127A46DCE737A06F1A2CC67A3039285B69798324FFA59EDB9CC347ACED48D`。最终产物 GUI 复验及隔离对象清理已完成,结果见下文。
- 定向用例覆盖数据库仅重排声明空白时完成改名、根对象单行草稿、调用方写入后字符串/注释/调用改变时禁止 DROP,以及原始快照仅空白改变仍在写前阻断。
- 核心 crate 的 `Clippy -D warnings` 通过。Web 的 `--no-deps` 定向检查通过;Tauri 的定向检查需对现有 `drain_collect`、`result_large_err` 告警明确豁免后通过。完整 Web 依赖检查因未修改驱动的既有告警失败,不能记为完整 CI Clippy 通过。本机 Rust 1.99.0,CI 固定 1.97.1。
- 完整类型检查已通过(`cb9e8ceb`,退出码 0):首次预检发现可用 6756 MiB,不足 6144 MiB 堆加 2048 MiB 余量,未执行;随后现场可用内存升至 8226 MiB,按原 6144 MiB 配置运行完整 `vue-tsc --noEmit` 成功,未降低限制。最终 SHA 的 CI 类型检查结果仍单独核对。
- 架构检查 27/28;唯一失败仍为 DuckDB 锁文件检查按 LF 分块,而本地文件为 CRLF。实际依赖条目存在,未修改无关锁文件或放宽检查。
### 最终产物 GUI 复验与清理
2026-10-14 核对运行文件为上述 `cb9e8ceb` 产物,仅监听回环地址;所载 OceanBase Oracle Agent JAR SHA-256 为 `D6C78A63F14FF0A8FCBD5FA074B4EAB93E5BE7F308D9609F83114807B6494B93`。通过产品 SQL 查询确认登录用户与当前 schema 均为本批既有测试身份。
- 先恢复本批调用方的静态调用加动态 SQL 场景,并精确移除上次部分执行创建的目标过程。侧栏预检正常结束,动态 SQL 仍被阻断,源草稿可编辑。
- 将调用方人工改为单行定义、两次静态调用,重新校验后执行重命名成功。通过产品查询读回:原名称对象数量为 0,目标过程与调用方两个对象均为 `VALID`,编译错误为 0。
- `USER_SOURCE` 全文确认两次调用均指向重命名目标;没有再因数据库重排声明空白误报失败,删除旧对象阶段也已完成。
- 按本批记录精确清理两个过程和两个包(含包体),再查询五个记录名称,`USER_OBJECTS` 与 `USER_ERRORS` 残留均为 0。没有执行测试过程或包内例程,其他对象未清理。
![单行人工草稿重命名后源对象为零、目标有效且无编译错误](oracle-routine-manual-success.jpg)
以上完成 Web GUI 与 OceanBase Oracle 模式验收;原生 Oracle 实库仍获准暂缓,原生桌面 GUI 未执行,最终提交的远端 CI 单独跟踪。