我的触发器有问题。它返回“没有找到数据”,我不知道如何解决它。你能救我吗?
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 ;
答案 0 :(得分: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 ;
答案 1 :(得分: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 ;