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

SQL Server、Oracle、DB2 視圖建立與管理語法對照:CREATE VIEW、ALTER VIEW、WITH CHECK OPTION 實戰

     編輯:Oracle 資料庫基礎

視圖本質:命名查詢的虛擬表

視圖不儲存實體資料,僅保存 SELECT 定義。核心價值:

  • 安全性:限制欄位/列存取(隱藏薪資、密碼欄位)
  • 簡化性:封裝複雜 Join/子查詢,應用端如查單表
  • 相容性:表結構變更時,修改視圖定義隔離應用影響

建立視圖:SQL Server 獨特 vs Oracle/DB2 統一

SQL Server:CREATE VIEW / ALTER VIEW 分離

-- 建立視圖
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;

Oracle / DB2:CREATE OR REPLACE 一體化

-- 建立或取代(不存在則建立,存在則替換)
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 或判斷存在性後動態執行。

WITH CHECK OPTION:視圖更新的守門員

當視圖定義包含 WHERE 條件時,直接 UPDATE/INSERT 視圖可能產生「不符合視圖定義的資料」,導致資料透過視圖查不出來。WITH CHECK OPTION 強制所有透過視圖的 DML 必須符合視圖的 WHERE 條件。

Oracle/DB2 完整示範

-- 建立帶檢查選項的視圖
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

SQL Server 同樣支援

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強制唯讀❌ 唯讀

進階視圖類型對照

類型OracleSQL ServerDB2
一般視圖CREATE VIEWCREATE VIEWCREATE VIEW
唯讀視圖WITH READ ONLYWITH CHECK OPTION + 條件永假WITH READ ONLY
物化視圖CREATE MATERIALIZED VIEWCREATE INDEXED VIEWCREATE MATERIALIZED QUERY TABLE
版本視圖VERSIONS BETWEEN (Flashback)不支援不支援
版本化視圖EDITIONING VIEW (11gR2+)不支援不支援

跨平台視圖管理最佳實踐

  1. 統一命名:V_<業務域>_<用途>,如 V_HR_EMP_DEPT20
  2. 文件化定義:視圖 DDL 納入版控,註解業務用途、基礎表、更新限制
  3. 授權策略:GRANT SELECT ON V_HR_EMP_DEPT20 TO app_role; 不授權基礎表
  4. 效能監控:視圖嵌套超過 3 層需審查,避免最佳化器展開失敗
  5. 遷移腳本化:建立自動化腳本轉換 ALTER VIEW ↔ CREATE OR REPLACE VIEW

總結

視圖語法核心差異在於 SQL Server 使用 ALTER VIEW 修改,Oracle/DB2 使用 CREATE OR REPLACE VIEW。WITH CHECK OPTION 是保護視圖資料完整性的關鍵機制,三平台皆支援。物化視圖/索引視圖是效能優化的進階手段,語法差異極大,遷移時需重寫。建立專案級視圖規範,統一定義、命名、授權與維護流程,是跨平台資料庫治理的重要一環。

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