12 KiB
OceanBase Oracle 普通视图改名验收
本次验收覆盖侧栏和对象浏览器的普通视图改名、同属主静态视图依赖同步,以及打开的源码草稿保护。基线为 188b94ece23c44a40515915bbf2048cf211a98dd。数据库为 OceanBase 4.2.5.7 Oracle 模式,产品入口使用 OceanBase Connector/J 2.4.19;验收于 2026-10-13 完成。
问题现象
原入口仅开放 OceanBase Oracle 表改名。普通视图可以执行不带属主的 RENAME,但直接改名会让原名称引用的依赖视图失效。旧源码编辑上下文还可能按原名称保存,重新创建旧对象。
复现与修复验证
操作入口:在侧栏或对象浏览器的普通视图上右键,选择「结构工具 → 重命名」。侧栏选中视图后也可按 F2。填写新名,核对依赖 SQL 预览后确认。
在隔离属主下创建根视图和两级依赖,根视图包含带引号的列别名与 WITH READ ONLY,三个视图均授予另一隔离账号 SELECT WITH GRANT OPTION。
- 从侧栏的「结构工具 → 重命名」将根视图改为带空格和混合大小写的引号名称。预览列出根视图
RENAME、直接依赖引用改写和间接依赖原定义重建。 - 从对象浏览器将根视图再次改名,并保留一个未保存的旧名称源码草稿。
- 通过产品 Agent 读回:旧名称消失,三个视图均为
VALID,列别名、只读属性和三项SELECT WITH GRANT OPTION保留,隔离视图查询结果均为 42。 - 保存旧草稿被身份检查阻断;草稿内容保留,数据库中的定义及值不变。
生产函数及组件测试覆盖取消、目标切换、依赖图变化、截断元数据、权限降级、两级重建、部分失败、响应未知、并发 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 实库继续获准暂缓;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 复验待完成。
写后指纹修复候选
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。没有执行测试过程或包内例程,其他对象未清理。
以上完成 Web GUI 与 OceanBase Oracle 模式验收;原生 Oracle 实库仍获准暂缓,原生桌面 GUI 未执行,最终提交的远端 CI 单独跟踪。




