В триггере нет данных - PullRequest
       6

В триггере нет данных

0 голосов
/ 05 октября 2011

У меня проблема с моим триггером.Он возвращает «данные не найдены», и я не знаю, как решить это.Вы можете мне помочь?

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 ;

Ответы [ 2 ]

5 голосов
/ 05 октября 2011

Не используйте автономные транзакции в обычном коде. Единственный случай, когда автономные транзакции действительно уместны, - это случаи, когда вы хотите записать данные в таблицу журнала независимо от того, зафиксировано ли базовое действие или нет. Например, если вы хотите зарегистрировать ошибку, откатить транзакцию и вызвать исключение, вы, вероятно, не хотите, чтобы сообщение журнала откатывалось. Вы никогда не должны использовать автономную транзакцию для обхода исключения с изменяющейся таблицей, что, как я полагаю, является причиной того, что вы использовали здесь автономную транзакцию, поскольку запрос к таблице 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 голос
/ 05 октября 2011

Поскольку у вас есть 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 ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...