которые соответственно добавляли бы новый отдел (без служащих) и удаляли отдел вместе со служащими. Теперь допустим, что у вас сложилось другое мнение о том, как распределить дополнительные деньги. Например, вы хотите вычислить увеличение фонда заработной платы в процентах и в соответствии с полученным значением поднять оклад каждого служащего. Сделать это довольно просто.
При тестировании данного примера мы предусмотрели наличие ограничения внешнего ключа для столбца deptno таблицы emp, в значительной степени рассчитывая встретить нашу старую знакомую — проблему ограничивающих и мутирующих таблиц. Об этой проблеме мы писали в книге "Oracle: проектирование баз данных", и многие сообщили, что эта информация очень пригодилась им в работе. Нам очень приятно, что мы помогли решить проблему ограничивающих и мутирующих таблиц, но еще приятнее сказать, что в процессе тестирования приведенного выше примера эта проблема не проявилась.
Роль триггеров INSTEAD OF
Приведенные в этом разделе небольшие примеры, возможно, покажутся экстремальными, но они служат иллюстрацией к следующим выводам:
1.   Для любого представления: если вы в состоянии определить смысл операций INSERT, UPDATE или DELETE, то можете приступать к реализации требуемых действий.
2.   Даже если смысл этих действий для вас полностью понятен, другим пользователям он может быть недостаточно ясен. Кроме того действия будут инкапсулированы в триггер и потенциально сложны для поиска. Использование нескольких триггеров INSTEAD OF лишь ухудшит ситуацию.
К сожалению, по нашим прогнозам, некоторые разработчики будут злоупотреблять триггерами INSTEAD OF и таким образом нанесут серьезный ущерб возможности сопровождения и, может быть, даже целостности своих приложений. Однако мы все же считаем, что триггеры INSTEAD OF играют естественную роль в обеспечении применения операторов INSERT, UPDATE и DELETE к тем представлениям, которые иначе не были бы обновляемыми (по крайней мере, тогда, когда правила обновления непротиворечивы). Вот примеры таких случаев:
»    Обеспечение обновления однотабличных представлений, которые из соображений безопасности не проецируют столбец типа NOT NUEL, присутствующий в таблице.
•    Представления, содержащие соединения, которые транслируют коды в стандартное значение: такие представления могут быть источником существенного увеличения производительности в системах клиент/сервер. Опять-таки, триггеры UPDATE и DELETE должны быть аккуратно написаны.
•    Представления UNION ALL, используемые для поддержки ручного секционирования. В данном случае задача кодирования триггерной логики на
3. Некоторые усовершенствовании в OractcS	33