Можно объявить триггер таким образом:
CREATE TRIGGER emp_insert INSTEAD OF INSERT ON emp_view BEGIN
DELETE FROM emp
WHERE empno = :new.empno; END;
Однако объявить этот триггер для таблицы emp невозможно. Допустимая форма, показанная в данном определении, является примером подрыва функциональности (subversion). Любой нормальный программист, занимающийся сопровождением, который знает или может проверить определение представления, увидев предложение
INSERT INTO emp_view (empno, ename, deptno) VALUES (1111, 'SMITH', 40);
предположит, что его результатом (при отсутствии ошибок) будет по меньшей мере одна новая строка в таблице emp. Условные триггеры могут самыми разными способами дополнять это действие, но основной смысл предложения все равно будет отражен в результате.
Триггер INSTEAD OF такой гарантии не дает. Как видно из нашего примера, результат может быть прямо противоположен очевидному смыслу предложения, в котором вызывается триггер. Поскольку этот код инкапсулирован в триггер, то при отсутствии доступа к словарю данных и возможности установить факт существования этого триггера, а также проверить его текст, вы столкнетесь с загадкой: вы видели предложение для вставки, выданное для emp_view, но при выборке из emp_view своих новых данных вы нигде не обнаружили! Однако, если такая вставка привела к добавлению дубликата empno (или, что более вероятно, к нарушению первичного ключа), то строка, в данный момент содержащая номер этого служащего, будет удалена. Возможно, данный пример кому-то покажется крайностью, но мы проверили его и он "работает".
Триггеры INSTEAD OF следует использовать очень осторожно. Избегайте так называемого чистого подрыва функциональности, т.е. не заставляйте сервер "молчать" при невыполнении того действия, которое предсказал бы любой достаточно информированный наблюдатель. Мы также рекомендуем не использовать несколько триггеров INSTEAD OF, запускаемых при наступлении одного и того же события для одного и того же представления. Эта возможность поддерживается, но не кажется нам разумной. Почему? Такие триггеры по своей природе независимы и не обязаны знать о действиях друг друга, но все же задаются как работающие вместо указанной операции, а не наряду с ней, как это делают другие триггеры.
Однако существует целый ряд случаев, когда триггеры INSTEAD OF можно использовать очень эффективно. Как мы говорили в книге "Oracle: проектирование баз данных", представления позволяют реализовать средства безопасности, ограничивая доступ определенных групп пользователей
30	Oracle 8