DeepEdit!

Программирование баз данных на Oracle, техническая документация, литература, статьи и публикации

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

Пример замещающего триггера

Вновь обратимся к представлению classes., rooms:
Операция
INSERT
UPDATE DELETE
Ввести информацию в это представление нельзя. Над ним можно вы­полнить операции обновления или удаления данных, но, скорее всего, эти действия будут некорректны. Например, в результате выполнения над classes_rooms операции DELETE будут удалены соответствующие строки из classes. Какое же поведение операции DML считается коррект­ным для classes_rooms? Это определяется правилами, установленными в организации. Предположим, что они таковы:
Значение
Назначить введенной группе указанную аудиторию. В результате classes обновляется.
Изменить аудиторию, назначенную группе. Это мо­жет привести к обновлению или classes, или rooms, в зависимости оттого, какой столбец classes_rooms
обновляется.
Очистить идентификатор аудитории для удаленной группы. В результате classes обновляется: ID устанавливается в значение NULL.
Триггер ClassesRoomsInstead реализует сформулированные выше прави­ла и позволяет правильно выполнить операцию DML над classes_rooms. Это более полная версия триггера ClassesRoomsInsert, по сравнению с представленной выше:

Внимание
Предложение FOR EACH ROW необязательно для замещающего триггера. Эти триггеры являются строковыми независимо от того, указана эта конструкция или нет.
В ClassesRoomsInstead для определения выполняемой операции DML и для соответствующей реакции на нее используются триггерные предикаты. На рис. 11.1 показано исходное содержимое classes, rooms и classes_rooms.
Выполним следующий оператор INSERT:

В результате обновления classes идентификаторы room_ID групп, располагавшихся первоначально в Building 6, приняли значение NULL (см. рис. 11.4). Обратите внимание на то, что после всех операций DML
таблица rooms осталась неизменной, модификациям подверглась только
таблица classes.
 









jAntivirus