Триггер, срабатывающий на ставку и удаление данных (PL SQL)

forspecial

суть триггера уровня строки есть таблица class в ней столбцы id_class и cnt_pupil (количество учеников) и есть таблица pupil она столбцом id_class ссылается на таблицу класснужно написать триггер, который срабатывает на ставку и удаление данных, и изменяет значение cnt_pupil в таблице class в зависимости от вставки либо удалениячто-то совсем не приходит на ум как это реализовать, впервые встретилась с триггером, который должен обновлять данные в таблиценадеюсь на помощь заранее спасибо
1 ответ

forspecial

нужно написать триггер, который срабатывает на ставку и удаление данных, и изменяет значение cnt_pupil в таблице class в зависимости от вставки либо удаления
В простейшем виде, если не принимать во внимание проблемы, которые могут возникнуть при параллельном многопользовательском доступе, то как-то так:
CREATE OR REPLACE TRIGGER trg_pupul1  
  AFTER INSERT OR DELETE OR UPDATE ON pupil 
  REFERENCING OLD AS OLD NEW AS NEW
  FOR EACH ROW
BEGIN
  IF DELETING THEN  
    -- Уменьшаем количество учеников класса
    UPDATE class SET cnt_puppil = cnt_puppil-1 WHERE id_class = :OLD.id_class;
  END IF;
 
  IF INSERTING THEN  
    -- Увеличиваем количество учеников класса
    UPDATE class SET cnt_puppil = cnt_puppil+1 WHERE id_class = :NEW.id_class;
  END IF;
 
  -- А если ученика из класса в класс перевели ?  
  IF UPDATING AND :NEW.id_class <> :OLD.id_class THEN  
    -- Уменьшаем количество учеников в старом классе
    UPDATE class SET cnt_puppil = cnt_puppil-1 WHERE id_class = :OLD.id_class;
    -- Увеличиваем количество учеников класса в новом классе
    UPDATE class SET cnt_puppil = cnt_puppil+1 WHERE id_class = :NEW.id_class;
  END IF;
 
END;
Если вариант с переводом ученика из класса в класс не рассматривается, можно удалить эту секцию