我有一个名为Favorites的简单表 .
Favorites
| username | type_of_movie | like_or_dislike |
数据如下所示:
AAA, Action, Like
AAA, Romance, Dislike
...
我已经触发了计算最喜欢的类型,并阻止用户喜欢所有类型 .
CREATE OR REPLACE TRIGGER trgLike
BEFORE INSERT OR UPDATE ON Favorite
FOR EACH ROW
DECLARE
count number;
BEGIN
SELECT
COUNT(username) INTO count
FROM
Favorite
WHERE
username= :NEW.username AND like_or_dislike = 'Like';
IF (count = 3) THEN
RAISE_APPLICATION_ERROR(-20000,'Too much liking');
END IF;
END;
/
我希望用户能够喜欢3种类型的电影 .
插入触发器工作得很好但是当我尝试更新某些不喜欢的东西时,我得到并且错误ORA-04091表处于变异状态 . 第6行出错 .
我怎么能阻止这个?我搜索了,似乎我的更新将改变我的选择的 Value ,但我不知道如何 .
我使用的是Oracle 11g版 .
2 回答
出现错误消息,因为您的触发器在表内容发生更改时同时查询
Favorite
表(UPDATE
或INSERT
) .要解决此问题,您需要三个触发器和一个小包:
在AskTom上有一个nice article .
p.s. :请参阅上面的更新和测试版本 .
您可以在触发器中使用物化视图 .