2017-08-16 28 views
0

我有一個表如何在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; 

但這返回我一個錯誤 - 我想,我不能有一個觸發器內的視圖。我對觸發器和程序很陌生,我只學了兩天。

我該怎麼做?

+3

視圖只是一個存儲的查詢......爲什麼當數據正在查詢更改時,您認爲您需要重新創建它?包括你得到的錯誤總是有幫助的,但是你也不能在觸發器中執行DDL(除非你讓它自治,但不要),並且沒有'replace view'語句。你整個前提似乎有缺陷。或者我錯過了什麼? –

+1

視圖不存儲數據(除非它是物化視圖)。每次調用視圖時,都會查詢表並生成計數等。因此,隨着數據在表中的更改,視圖中的數據也會發生變化。然而,物化視圖需要刷新,但這似乎並不是你正在使用的。所以說,只需再次調用視圖來獲取「刷新」數據,無需重新生成視圖。 – xQbert

+0

Alex Poole:謝謝,很高興知道!那麼它存在一個聲明「創建或替換視圖」,我只是把「創建」了:D所以我只是做「創建或替換視圖」聲明視圖的名稱是相同的,但與不同的選擇,對吧?我想現在我遇到了這個問題。 xQbert:是的,你說得對。那麼,當它是一個物化視圖時,我將如何令人耳目一新? –

回答

0

如果商店很少更新,刪除或插入,那麼它可以被接受,做你說你想做的事情。在這種情況下,after語句觸發器中的自主事務可能是可以接受的,並且允許您重新實現視圖。但是,如果對此類事件的發生率有多少疑問或者如果您不想創建一個脆弱的系統(它肯定會是這樣),那麼我建議您去找項目發起人並洽談物化視圖刷新之間的時間量。在這種情況下,您將創建一個可執行任務的dbms_scheduler作業。

+0

它沒有說它是*物化*視圖。如果是的話,你會使用正常的刷新機制,而不是強制刷新的觸發器? –

+0

根據這個問題的表達方式,這可能是他想做的事情,但在第二段中我勸阻他這樣做。 – jeff6times7