視圖提供資料隱藏、邏輯獨立、簡化查詢等優勢,但它終究是「虛擬表」,底層仍依賴基礎表。若嘗試直接對視圖寫入資料,或在定義中使用特定語法,必須遵守四大鐵律,否則會遭遇錯誤或效能陷阱。
對視圖 INSERT/UPDATE/DELETE 實際操作的是基礎表,但以下情況不可直接更新:
GROUP BY、HAVING、AVG、MAX、SUM 等彙總函數,導致單一視圖列對應多筆基礎記錄,無法定位唯一物理行。實務建議:需寫入資料時,優先直接操作基礎表,或在應用層實作業務邏輯驗證;視圖專注於「讀取簡化」。
SELECT ... INTO,需改用預存程序或函數實現同樣功能。ORDER BY(除非搭配 TOP),這與 Oracle 不同,遷移專案常踩坑。排序應交由外層查詢處理。Duplicate column name)。範例:
-- 錯誤:衍生欄無別名
CREATE VIEW v_bad AS SELECT price * 1.05 FROM products;
-- 正確:指定別名
CREATE VIEW v_good AS SELECT price * 1.05 AS adjusted_price FROM products;
CREATE VIEW 權限(資料庫層級),擁有建表權限不代表有建視圖權限。SELECT(或相關)權限;缺一不可。WITH GRANT OPTION。| 場景 | 建議做法 |
|---|---|
| 報表、表單、唯讀查詢 | 大量使用視圖,封裝複雜聯結與業務邏輯 |
| 高頻寫入、OLTP 核心交易 | 直接操作基礎表,配合預存程序、觸發器、CHECK 約束保障完整性 |
| 跨資料庫/異構資料整合 | 視圖搭配連結伺服器、OPENQUERY 封裝異構查詢 |
身為 DBA,核心能力在於判斷何時用視圖、何時直取基礎表,在安全、效能、維護性間取得平衡。