視圖不儲存實體資料,僅保存 SELECT 定義。核心價值:
-- 建立視圖
CREATE VIEW empv20
AS SELECT *
FROM emp
WHERE deptno = 20;
-- 修改視圖(必須用 ALTER,不可重複 CREATE)
ALTER VIEW empv20
AS SELECT ename
FROM emp
WHERE deptno = 20;
-- 刪除視圖
DROP VIEW empv20;
-- 建立或取代(不存在則建立,存在則替換)
CREATE OR REPLACE VIEW empvu20
AS SELECT *
FROM emp
WHERE deptno = 20;
-- 同一語句即可修改,無需 ALTER VIEW
CREATE OR REPLACE VIEW empvu20
AS SELECT ename, sal
FROM emp
WHERE deptno = 20;
遷移提示:SQL Server → Oracle 遷移時,將所有
ALTER VIEW改為CREATE OR REPLACE VIEW;反向遷移需拆分為DROP VIEW IF EXISTS+CREATE VIEW或判斷存在性後動態執行。
當視圖定義包含 WHERE 條件時,直接 UPDATE/INSERT 視圖可能產生「不符合視圖定義的資料」,導致資料透過視圖查不出來。WITH CHECK OPTION 強制所有透過視圖的 DML 必須符合視圖的 WHERE 條件。
-- 建立帶檢查選項的視圖
CREATE OR REPLACE VIEW empvu20
AS SELECT *
FROM emp
WHERE deptno = 20
WITH CHECK OPTION CONSTRAINT empvu20_ck; -- 可選:命名約束方便管理
-- 測試:嘗試將 deptno=20 的員工改為 deptno=10
UPDATE empvu20
SET deptno = 10
WHERE empno = 7788;
-- 結果:報錯阻擋
-- ORA-01402: view WITH CHECK OPTION where-clause violation
CREATE VIEW empv20
AS SELECT *
FROM emp
WHERE deptno = 20
WITH CHECK OPTION; -- SQL Server 不支援命名約束
-- 同樣會阻擋違反 WHERE 條件的 UPDATE/INSERT
| 限制類型 | 說明 | 是否可更新 |
|---|---|---|
| 單一基礎表 | 視圖僅查詢一張表,無聚合/分組/去重 | ✅ 可更新 |
| 包含 GROUP BY / DISTINCT | 結果非 1:1 對應基礎表列 | ❌ 唯讀 |
| 包含聚合函數 | SUM, COUNT, AVG 等 | ❌ 唯讀 |
| 包含 JOIN 多表 | 通常唯讀,Oracle 部分可更新 Key-Preserved Table | ⚠ 視情況 |
| 包含子查詢/集合運算 | UNION, MINUS, 子查詢 | ❌ 唯讀 |
| 欄位為運算式/函數 | SELECT sal*12 AS ann_sal | ❌ 唯讀 |
| WITH READ ONLY | 強制唯讀 | ❌ 唯讀 |
| 類型 | Oracle | SQL Server | DB2 |
|---|---|---|---|
| 一般視圖 | CREATE VIEW | CREATE VIEW | CREATE VIEW |
| 唯讀視圖 | WITH READ ONLY | WITH CHECK OPTION + 條件永假 | WITH READ ONLY |
| 物化視圖 | CREATE MATERIALIZED VIEW | CREATE INDEXED VIEW | CREATE MATERIALIZED QUERY TABLE |
| 版本視圖 | VERSIONS BETWEEN (Flashback) | 不支援 | 不支援 |
| 版本化視圖 | EDITIONING VIEW (11gR2+) | 不支援 | 不支援 |
V_<業務域>_<用途>,如 V_HR_EMP_DEPT20GRANT SELECT ON V_HR_EMP_DEPT20 TO app_role; 不授權基礎表ALTER VIEW ↔ CREATE OR REPLACE VIEW視圖語法核心差異在於 SQL Server 使用 ALTER VIEW 修改,Oracle/DB2 使用 CREATE OR REPLACE VIEW。WITH CHECK OPTION 是保護視圖資料完整性的關鍵機制,三平台皆支援。物化視圖/索引視圖是效能優化的進階手段,語法差異極大,遷移時需重寫。建立專案級視圖規範,統一定義、命名、授權與維護流程,是跨平台資料庫治理的重要一環。