Представление - это на самом деле просто сохраненный запрос. Базовые таблицы не знают, что представление существует, и изменения в них не влияют на представление напрямую. В следующий раз, когда вы сделаете запрос к представлению, вместо этого будут запрошены базовые таблицы, и вы увидите данные в таблицах в этот момент.
Триггер вместо запускается при вставке в представление, а не при вставке в базовую таблицу. Обычно это «перехватывает» вставку и изменяет базовые таблицы.
В качестве демонстрации, использование локальной таблицы (это удаленная таблица, доступ к которой осуществляется по ссылке на базу данных в вашей версии, не имеет никакого значения для того, как это работает):
create table t42 (id number);
create view v42 as select * from t42;
create trigger v42_trig instead of insert on v42 for each row
begin
dbms_output.put_line('Instead-of trigger fired for ID: ' || :new.id);
end;
/
set serveroutput on
Если я вставлю в представление, сработает триггер, что мы видим из сообщения отладки:
insert into v42 (id) values (1);
1 row inserted.
Instead-of trigger fired for ID: 1
Поскольку триггер только показывает сообщение, в базовой таблице фактически не было вставлено ни одной строки, несмотря на возвращаемое сообщение о состоянии (в данном случае SQL Developer). Обычно триггер делает что-то более полезное, конечно.
Если я вставляю в таблицу напрямую, отладка не отображается, потому что триггер не срабатывает:
insert into t42 (id) values (2);
1 row inserted.
Но эта строка была фактически вставлена, и запрос к представлению показывает только это, а не тот, который был перехвачен триггером ранее:
select * from v42;
ID
----------
2
Если вы хотите, чтобы при вставке строки в таблицу было предпринято какое-то действие, вам нужно иметь триггер на самой таблице. Возможно, вы могли бы заменить свое представление на локальное материализованное представление и иметь триггер для этого, но ссылка на базу данных тоже довольно сложная.