如何在Oracle 11g中使用触发器自动刷新视图?

时间:2017-08-16 14:34:27

标签: database view oracle11g triggers

我有一张桌子

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;

但这会给我一个错误 - 我想我不能在触发器中有一个视图。我对触发器和程序都很陌生,我只学了2天。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

如果很少更新,删除或插入商店,那么可能可以接受你想做的事情。在这种情况下,after语句触发器主体中的自治事务可能是可接受的,并允许您重新实现视图。

但是,如果对此类事件的罕见程度或者您不想创建一个脆弱的系统(它肯定会是这样)有任何疑问,那么我建议您去项目发起人并进行谈判物化视图刷新之间的时间量。在这种情况下,您将创建一个执行任务的dbms_scheduler作业。