SQL Server 視圖與資料表結構相似,透過視圖執行 INSERT、UPDATE、DELETE 操作時,實際作用的是視圖所引用的基礎資料表。然而,視圖操作資料受到較多限制,若不瞭解規則極易導致資料不一致或操作失敗。本文透過具體案例,詳細說明視圖資料操作的規則與陷阱。
使用 SELECT 查詢視圖與基礎資料表時,可見相同記錄。但執行特定 INSERT 陳述式後,新資料可能僅存在於基礎資料表,而不出現在視圖結果集中。這發生的原因在於:視圖定義的 WHERE 條件或連接邏輯過濾了新插入的資料列。
關鍵提醒:向視圖插入資料實質上是向基礎資料表插入資料,因此必須確認「包含在視圖欄位中但屬於基礎資料表的欄位」允許 NULL 值或擁有預設值,否則插入將失敗。
若視圖聯合多個資料表(如 au_title 同時關聯作者與標題資料表),單一 INSERT 陳述式只能操作屬於同一個基礎資料表的欄位。需拆分為多條陳述式分別插入:
-- 僅插入作者相關欄位
INSERT INTO au_title (author_au_id, au_lname, au_fname, contract)
VALUES ('234-34-4611', 'John', 'Smith', 1);
-- 僅插入標題相關欄位
INSERT INTO au_title (title_au_id, title_id, au_ord, royaltyper)
VALUES ('234-34-4611', 'BU1111', 1, 50);
UPDATE 或 DELETE 影響的資料列,必須包含在視圖的結果集中。若資料列被視圖的 WHERE 條件過濾掉,則無法透過視圖修改或刪除。DELETE:完全禁止對多表視圖執行刪除操作。UPDATE:被更新的欄位必須屬於同一個基礎資料表,不可跨表更新。INSTEAD OF 觸發器以實現複雜視圖的自定義更新邏輯