2011-10-05 133 views
0

我的触发器有问题。它返回“找不到数据”,我不知道如何解决它。你可以帮我吗 ?在触发器中找不到数据

create or replace 
TRIGGER nb_action 
    AFTER INSERT ON Message 
    FOR EACH ROW 
DECLARE 
    vAuteur integer; 
    PRAGMA AUTONOMOUS_TRANSACTION; 
BEGIN 
    SELECT id_auteur INTO vAuteur FROM Message where id_message = :new.id_message; 
    UPDATE Utilisateur SET nb_action=nb_action+1 where id_utilisateur=vAuteur; 
END ; 

回答

1

既然你在触发器具有PRAGMA AUTONOMOUS_TRANSACTION;这意味着它不能看到刚刚插入,因为它是在一个不同的未提交的事务,因此您SELECT不返回任何数据的行...

尝试

create or replace 
TRIGGER nb_action 
    AFTER INSERT ON Message 
    FOR EACH ROW 
DECLARE 
    PRAGMA AUTONOMOUS_TRANSACTION; 
BEGIN 
    UPDATE Utilisateur SET nb_action=nb_action+1 where id_utilisateur=:new.id_auteur; 
END ; 
+2

那里没有必要使用自治事务。而且这样做存在巨大的风险,因为即使当父事务回滚时以及Oracle由于写一致性而多次执行触发器时,自治事务将提交对“Utilisateur”表的更改。 –

5

不要在正常代码中使用自治事务。只有当自治事务真正适合时,无论基础操作是否提交,您都希望将数据写入日志表。例如,如果要记录错误,回滚事务并引发异常,则可能不希望回滚日志消息。您绝对不应该使用自治事务来处理突变表异常,我假设您在此处使用自治事务的原因,因为如果针对Message表的查询不会在自治事务中引发突变表异常。

幸运的是,在这种情况下,不需要查询定义触发器的表并且不需要使用自治事务。只需

create or replace trigger nb_action 
    AFTER INSERT ON Message 
    FOR EACH ROW 
BEGIN 
    UPDATE Utilisateur 
    SET nb_action=nb_action+1 
    where id_utilisateur=:new.id_auteur; 
END ; 
+2

同意。但是,请更正“where”部分更新语句:':new.id_auteur'而不是':new.id_message'。 – ThinkJet

+0

@ThinkJet - 感谢您的收获。更正。 –