由于您的视图将包含实际表中不存在的一列,因此您需要使用instead of
触发器来使视图可更新。
像这样的东西:
create table smaller_table
(
id integer not null primary key,
some_column varchar(20)
);
create view real_table
as
select id,
some_column,
null as old_column
from smaller_table;
现在您的旧代码将运行如下内容:
insert into real_table
(id, some_column, old_column)
values
(1, 'foo', 'bar');
这导致:
ORA-01733: 此处不允许使用虚拟列
为了解决这个问题,您需要一个INSTEAD OF
触发器:
create or replace trigger comp_trigger
instead of insert on smaller_table
begin
insert into old_table
(id, some_column)
values
(:new.id, :new.some_column);
end;
/
现在“old_column”的值将被忽略。您也需要类似的更新。
如果您的视图包含连接,那么您也可以在触发器中处理这种情况。只需根据数据对两个不同的表进行更新/插入
有关更多详细信息和示例,请参阅手册
http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/triggers.htm#i1006376