首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle View 視圖完全指南:建立、類型、權限、DML 與效能考量

     編輯:Oracle 資料庫基礎

什麼是 View?

View 是**儲存的查詢定義**(Stored Query),不儲存資料。**基表** 才是實體儲存。View 提供:安全性(列/行過濾)、簡化複雜查詢、邏輯獨立性(表結構變更時 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 OPTIONDML 時檢查新/修改行是否滿足子查詢 WHERE 條件,否則拋錯。
WITH READ ONLY禁止任何 DML,純查詢 View。

四大 View 類型與 DML 能力

類型定義特徵可 DML?典型用途
Simple View單表、無函數/運算式/GROUP BY、含 PK/所有 NOT NULL 欄位**全可**安全過濾、簡化權限
Join View多表 JOIN**條件可**(Key-Preserved 表)多表邏輯整合
Complex View含函數/運算式/GROUP BY/DISTINCT/子查詢/集合運算**不可**報表、聚合、轉換
Read-Only View加 WITH READ ONLY**不可**純查詢、防誤改

Join View 可更新性核心:Key-Preserved Table

若基表的 **Primary Key / Unique Key 在 View 中仍保持唯一**,該表為 Key-Preserved。
規則:

  • **只能修改 Key-Preserved 表的欄位**。
  • **單次 DML 只能針對一個基表**。
  • WITH CHECK OPTION 時:Join 條件欄位、基表其他共同欄位**不可更新**;非共同欄位可更新。
  • DELETE 允許(即使有 CHECK OPTION)。
  • Self-Join View:**所有欄位可更新**。

Force View 實戰:先建 View 再建表

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

適用:大型專案並行開發、遷移腳本順序不確定時。

View 維護操作

操作語法影響
修改定義CREATE OR REPLACE VIEW v AS ...保留授權,**相依 View/PL/SQL 變 INVALID**
重新編譯ALTER VIEW v COMPILE;基表結構變更後主動編譯,發現錯誤早修
刪除DROP VIEW v;定義移除、授權移除、相依物件 INVALID,**基表資料不受影響**

查詢 View 中繼資料

-- 所有可見 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';

效能考量與最佳實踐

  1. View 不會自動優化:Oracle 將 View 定義與外層查詢**合併解析**(Query Transformation),等同直接寫合併後的 SQL。複雜 View 可能阻礙 Predicate Pushing、Join Elimination。
  2. 避免在 View 疊加 View:嵌套層級超過 3-4 層,優化器容易產生次佳計畫。改用 WITH 子句 (CTE) 或物化視圖。
  3. Complex View 改用 Materialized View:聚合、大表 Join 預計算,定時刷新,查詢秒級返回。
  4. 安全性第一:敏感欄位(薪資、身分證)建立 WITH CHECK OPTION View 授權給應用帳號,基表僅 DBA 可見。
  5. 命名規範: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 全生命週期。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved