對檢視表或函數 'XXX' 的更新或插入失敗,因其包含衍生欄位或常數欄位。
建立的 View 包含計算欄位 (如 AVG(grade))、常數、運算式,這些欄位無法直接寫入,導致 View 不可更新。
-- 範例:不可更新的 View
CREATE VIEW D_S_G (sno, avg_grade)
AS
SELECT sno, AVG(grade) FROM SC GROUP BY sno;
-- avg_grade 為聚合計算欄位,無法 INSERT/UPDATE
-- 1. 建立同結構實體表 (無資料)
SELECT * INTO d_s_t FROM d_s_g WHERE 1 <> 1;
-- 2. 將 View 資料複製進實體表
INSERT INTO d_s_t SELECT * FROM d_s_g;
-- 3. 後續對 d_s_t 進行 INSERT/UPDATE/DELETE
View 可直接修改需同時滿足:
若必須保留 View 介面,可建立 INSTEAD OF INSERT/UPDATE/DELETE 觸發器攔截操作並轉寫入基礎表:
CREATE TRIGGER tr_v_D_S_G_Insert ON D_S_G
INSTEAD OF INSERT
AS
BEGIN
-- 解析 inserted 資料,寫入基礎表 SC
INSERT INTO SC (sno, grade)
SELECT sno, avg_grade FROM inserted; -- 需業務邏輯反推
END
SELECT INTO 建立暫存實體表最簡單可靠