Файл: Лекция 14 Хранимый код. Триггеры 14 Процедурные расширения языка sql.doc
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 26.10.2023
Просмотров: 84
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
create trigger st_del
before DELetE on students
for each row
begin
INSERT INTO archive_students
VALUES(:OLD.cod_st, :OLD.name_st, :OLD.born, :OLD.phone);
end;
Триггер на удаление из таблицы оценок выглядит аналогично, фраза
for each row
вызовет его срабатывание при удалении каждой оценки студента.
3. Триггер на изменение оценки
Изменения, вносимые в данные, являющиеся важными в своей предметной обасти, обычно фиксируются в журналах изменений. В базах данных такие журналы могут представлять собой обычные таблицы и формироваться при помощи триггеров. Триггеры, предназначенные для контроля изменений в важных таблицах, могут быть написаны и на вставку, и на удаление, и на обновление.
В нашей демонстрационной базе данных, очевидно, имеет смысл контролировать изменение уже выставленной оценки. Поэтому создадим специальную таблицу change_mark_log (журнал изменений оценок), которая будет содержать столбы:
-
name_user (имя пользователя, изменившего оценку) -
date_change (дата изменения оценки) -
cod_st (код студента) -
cod_sub (код предмета) -
old_mark (старая оценка) -
new_mark (новая оценка)
Теперь создадим триггер на обновление:
create trigger mark_change
AFTER UPDATE on marks (mark)
for each row
begin
IF :OLD.mark<> :NEW.mark THEN
INSERT INTO change_mark_log
VALUES(user, sysdate, :OLD.cod_st, :OLD.cod_sub, :OLD.mark, :NEW.mark);
END IF;
end;
Для проверки работоспособности триггера нужно выполнить команду, активизирующую триггер. Например, для последнего триггера:
UPDATE marks SET mark=3 WHERE mark=2
Если в таблице оценок были неудовлетворительные оценки, таблица change_mark_log будет содержать исчерпывающие сведения об их изменении.