Файл: Лекция 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 будет содержать исчерпывающие сведения об их изменении.