我有一個表如何在Oracle 11g中使用觸發器自動刷新視圖?
STORE (ID, NAME, CITY_ID)` and a table `CITY (ID, NAME)`
和
CITY_STORE (CITY_ID, CITY_NAME, COUNT_STORES)
我已創建的視圖V_CITY_STORE
其中我有一個柱,其示出了存儲在特定城市的計數的圖,COUNT_STORES (COUNT(STORE.ID))
CREATE OR REPLACE VIEW V_CITY_STORE AS
SELECT C.ID CITY_ID, C.NAME CITY_NAME, COUNT(S.ID) COUNT_STORES
FROM CITY C
LEFT JOIN STORE S ON S.CITY = C.ID
GROUP BY C.ID, C.NAME;
我想創建一個觸發器,它會自動更新每個城市的商店數量重新更新,刪除或插入新的商店。
我試圖讓一個觸發器在我刷新視圖:
CREATE OR REPLACE TRIGGER T_CITY_STORE
AFTER INSERT OR UPDATE OR DELETE ON STORE
BEGIN
REPLACE VIEW V_CITY_STORE AS
SELECT C.ID CITY_ID, C.NAME CITY_NAME, COUNT(S.ID) COUNT_STORES
FROM CITY C
LEFT JOIN STORE S ON S.CITY = C.ID
GROUP BY C.ID, C.NAME;
END;
但這返回我一個錯誤 - 我想,我不能有一個觸發器內的視圖。我對觸發器和程序很陌生,我只學了兩天。
我該怎麼做?
視圖只是一個存儲的查詢......爲什麼當數據正在查詢更改時,您認爲您需要重新創建它?包括你得到的錯誤總是有幫助的,但是你也不能在觸發器中執行DDL(除非你讓它自治,但不要),並且沒有'replace view'語句。你整個前提似乎有缺陷。或者我錯過了什麼? –
視圖不存儲數據(除非它是物化視圖)。每次調用視圖時,都會查詢表並生成計數等。因此,隨着數據在表中的更改,視圖中的數據也會發生變化。然而,物化視圖需要刷新,但這似乎並不是你正在使用的。所以說,只需再次調用視圖來獲取「刷新」數據,無需重新生成視圖。 – xQbert
Alex Poole:謝謝,很高興知道!那麼它存在一個聲明「創建或替換視圖」,我只是把「創建」了:D所以我只是做「創建或替換視圖」聲明視圖的名稱是相同的,但與不同的選擇,對吧?我想現在我遇到了這個問題。 xQbert:是的,你說得對。那麼,當它是一個物化視圖時,我將如何令人耳目一新? –