Вы перепутали некоторые имена, когда вы пишете 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;