Force View

1. 目的

  • 本文档解释 IvorySQL 中 Force View 的用途,帮助用户在依赖对象尚未就绪时仍可创建强制视图占位并保持与 Oracle 行为一致。

  • Force View 可支持在依赖表尚未准备好的情况下进行视图迁移,在依赖满足后通过自动或显式编译快速恢复为普通视图。

2. 功能说明

  • CREATE [OR REPLACE] FORCE VIEW:即使查询引用了不存在的表或函数,也会创建视图占位对象并保存原始 SQL,提示“View created with compilation errors”。

  • 自动编译:访问 Force View 时会尝试重新编译;成功后变为普通视图,失败则报错 view "<schema>.<name>" has errors

  • 依赖失效回退:当普通视图因依赖对象被删除或结构变更而失效时,系统会自动将其转化为 Force View,保留最后一次有效定义以便后续恢复。

3. 测试用例

3.1. 创建缺失依赖的 Force View

-- 引用不存在的基础表,验证可成功创建占位
CREATE FORCE VIEW fv_customer AS
SELECT c_id, c_name FROM missing_customer;
-- 期望输出:WARNING: View created with compilation errors

3.2. 自动编译并恢复为普通视图

-- 先补齐依赖对象
CREATE TABLE missing_customer(
  c_id   int primary key,
  c_name text
);
INSERT INTO missing_customer VALUES (1, 'Alice');

-- 访问 Force View 时自动尝试编译
SELECT * FROM fv_customer;
-- 成功时视图转换为普通视图并返回数据

3.3. 显式编译与失败回退

-- 再次让视图失效:重建定义为 Force View
CREATE OR REPLACE FORCE VIEW fv_customer AS
SELECT c_id, upper(c_name) AS c_name FROM missing_customer_v2;

-- 显式编译:依赖仍缺少,保持 Force View 状态并输出 WARNING
ALTER VIEW fv_customer COMPILE;
-- 期望输出:WARNING: View altered with compilation errors

-- 补齐依赖后再次编译
CREATE TABLE missing_customer_v2(
  c_id   int,
  c_name text
);
ALTER VIEW fv_customer COMPILE;
-- 期望输出:ALTER VIEW 成功,视图恢复为普通视图