視圖是儲存的 SELECT 查詢,本身不儲存資料(索引視圖除外),每次引用時展開執行。主要價值:
| 類型 | 定義 | 可更新性 | 典型用途 |
|---|---|---|---|
| 標準視圖 | 單一 SELECT,無聚合、無 DISTINCT、無 UNION | 可更新(符合條件) | 資料存取介面、權限控管 |
| 複雜視圖 | 含 GROUP BY、JOIN 多表、衍生欄位 | 通常不可更新 | 報表查詢、資料轉換 |
| 索引視圖 | WITH SCHEMABINDING + 唯一叢集索引 | 不可直接更新 | 預先計算彙總、加速複雜查詢 |
| 分割視圖 | UNION ALL 多個結構相同的表(不同資料分區) | 可更新(含分區欄位) | 大量資料水平分割、歸檔 |
CREATE VIEW dbo.V_HighValueOrders
WITH SCHEMABINDING, CHECK OPTION
AS
SELECT OrderID, CustomerID, TotalAmount
FROM dbo.Orders
WHERE TotalAmount > 10000; -- 僅允許 >10000 的資料被 INSERT/UPDATE
若嘗試 INSERT INTO V_HighValueOrders VALUES (..., 5000) 會報錯,確保資料一致性。
CREATE VIEW dbo.V_SensitiveData
WITH ENCRYPTION
AS SELECT ...;
加密後 sp_helptext、OBJECT_DEFINITION 均回傳 NULL,**不可逆**,請妥善保管原始腳本。
ALTER VIEW 實際上是 DROP + CREATE,會移除視圖原有的權限、加密、CHECK OPTION、擴展屬性。修改時必須在腳本中完整重述所有選項:
ALTER VIEW dbo.V_Example
WITH ENCRYPTION, CHECK OPTION, SCHEMABINDING
AS SELECT ...;
sp_helptext 或 OBJECT_DEFINITION 檢視定義,避免直接查系統表。| 反模式 | 問題 | 修正建議 |
|---|---|---|
| 把所有查詢都包成視圖 | 維護地獄、計畫快取污染 | 僅對穩定、共用、需權限控制的查詢建視圖 |
| 視圖中使用 SELECT * | 基底表新增欄位導致視圖輸出變更、應用報錯 | 明確列出欄位清單 |
| 視圖缺少 SCHEMABINDING | 基底表結構變更不被阻擋,視圖失效 | 加上 WITH SCHEMABINDING(需兩部分名稱) |