создать триггер для обновления значений - PullRequest
0 голосов
/ 05 мая 2019

У меня есть эти две таблицы

  • Проект (projID, TotArticles)
  • Статья (prodID, ArticleID)

Как создать триггер для обновления на 1 общего количества статьи каждый раз, когда кто-то публикует статью на нем?

CREATE TRIGGER Art_Up
AFTER INSERT ON Article
FOR EACH ROW
    UPDATE Project
    SET TotArticle = TotArticle + 1
    WHERE paperID = NEW.PaperID;

Однако, это дает мне эту ошибку. PLS-00103: Обнаружен символ ";"

1 Ответ

0 голосов
/ 06 мая 2019

Вы перепутали некоторые имена, когда вы пишете projID, один раз prodID, и в вашем триггере это paperID.Также триггер не имеет begin ... end;.И вы не обрабатывали добавление статей, где projID не существует в таблице project.Вы можете проверить это сначала или использовать rowcount после обновления, а если оно равно 0, тогда используйте insert.Более простым является использование слияния.

create or replace trigger art_up after insert on article for each row
begin
  merge into project
  using (select :new.projid projid from dual) src
  on (project.projid = src.projid)
  when matched then update set totarticles = totarticles + 1
  when not matched then insert (projID, TotArticles) values (:new.projid, 1);
end;

Это работает, я тестировал некоторые базовые вставки, но это вообще не рекомендуется, потому что:

  • это плохая идея сохранятьлогика в триггерах,
  • триггеры могут быть сброшены, отключены, и тогда эта информация может вводить в заблуждение, ложь,
  • мы замедляем операции вставки,
  • этот триггер не обрабатывает delete где вы должны уменьшить общее количество статей.

Вместо триггера используйте простое представление:

create or replace view vw_project as select projID, count(1) total from article group by projid;
...