View 是**儲存的查詢定義**(Stored Query),不儲存資料。**基表** 才是實體儲存。View 提供:安全性(列/行過濾)、簡化複雜查詢、邏輯獨立性(表結構變更時 View 可屏蔽影響)。
CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW [schema.]view_name
[(alias1, alias2, ...)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint_name]]
[WITH READ ONLY];
| 子句 | 說明 |
|---|---|
OR REPLACE | 存在同名 View 時直接替換,**保留授權**;否則需先 DROP 再建(授權遺失)。 |
FORCE | 基表不存在/無權限也強制建立,View 狀態 INVALID,基表就緒後自動編譯生效。 |
NOFORCE | 預設。基表必須存在且有權限。 |
| 別名列表 | 對應子查詢 SELECT 列,**必須同數**。含函數/運算式時**必須指定別名**。 |
WITH CHECK OPTION | DML 時檢查新/修改行是否滿足子查詢 WHERE 條件,否則拋錯。 |
WITH READ ONLY | 禁止任何 DML,純查詢 View。 |
| 類型 | 定義特徵 | 可 DML? | 典型用途 |
|---|---|---|---|
| Simple View | 單表、無函數/運算式/GROUP BY、含 PK/所有 NOT NULL 欄位 | **全可** | 安全過濾、簡化權限 |
| Join View | 多表 JOIN | **條件可**(Key-Preserved 表) | 多表邏輯整合 |
| Complex View | 含函數/運算式/GROUP BY/DISTINCT/子查詢/集合運算 | **不可** | 報表、聚合、轉換 |
| Read-Only View | 加 WITH READ ONLY | **不可** | 純查詢、防誤改 |
若基表的 **Primary Key / Unique Key 在 View 中仍保持唯一**,該表為 Key-Preserved。
規則:
WITH CHECK OPTION 時:Join 條件欄位、基表其他共同欄位**不可更新**;非共同欄位可更新。DELETE 允許(即使有 CHECK OPTION)。CREATE FORCE VIEW v_test AS SELECT c1, c2 FROM not_exist_yet; -- 警告:INVALID
CREATE TABLE not_exist_yet (c1 NUMBER PRIMARY KEY, c2 VARCHAR2(20));
SELECT * FROM v_test; -- 自動編譯 → VALID
適用:大型專案並行開發、遷移腳本順序不確定時。
| 操作 | 語法 | 影響 |
|---|---|---|
| 修改定義 | CREATE OR REPLACE VIEW v AS ... | 保留授權,**相依 View/PL/SQL 變 INVALID** |
| 重新編譯 | ALTER VIEW v COMPILE; | 基表結構變更後主動編譯,發現錯誤早修 |
| 刪除 | DROP VIEW v; | 定義移除、授權移除、相依物件 INVALID,**基表資料不受影響** |
-- 所有可見 View 定義
SELECT view_name, text FROM ALL_VIEWS WHERE owner = 'SCOTT';
-- View 欄位資訊
SELECT * FROM ALL_TAB_COLUMNS WHERE table_name = 'V_EMP';
-- 可更新欄位
SELECT column_name, insertable, updatable, deletable
FROM ALL_UPDATABLE_COLUMNS
WHERE table_name = 'V_EMP_DEPT';
WITH 子句 (CTE) 或物化視圖。WITH CHECK OPTION View 授權給應用帳號,基表僅 DBA 可見。V_ 前綴 + 業務域 + 用途(如 V_HR_EMP_SALARY_MASKED)。| 現象 | 原因 | 對策 |
|---|---|---|
| View 查詢慢 | 合併後計畫差、缺索引、統計過期 | 看合併後計畫、補索引、收集統計、考慮 MV |
| DML 報 ORA-01779 | 修改非 Key-Preserved 表欄位 | 只改 PK 保留表、或拆分 View |
| OR REPLACE 後應用報錯 | 相依 PL/SQL 變 INVALID | 部署腳本包含 ALTER PROCEDURE ... COMPILE 批量重編譯 |
| FORCE View 長期 INVALID | 基表永未建立/拼寫錯誤 | 定期查 USER_OBJECTS WHERE STATUS='INVALID' AND OBJECT_TYPE='VIEW' |
View 是**邏輯層封裝**利器:Simple View 給安全與簡化,Join View 給多表整合(注意 Key-Preserved 規則),Complex View 給報表聚合(但不可 DML、慎用於高頻查詢)。掌握 OR REPLACE 保留授權、FORCE 解耦建立順序、WITH CHECK OPTION 守護資料完整性、MATERIALIZED VIEW 解決效能瓶頸,即可駕馭 View 全生命週期。