Oracle中的视图可能在特定条件下可更新。这可能很棘手,通常是不可取的。
关于可更新视图的注意事项
可更新视图是可用于插入,更新或删除基表行的视图。您可以创建一个视图来固有更新,也可以在任何视图上创建一个INSTEAD OF触发器,使其可更新。
要了解是否以及以何种方式修改固有可更新视图的列,请查询USER_UPDATABLE_COLUMNS数据字典视图。此视图显示的信息仅对固有可更新视图有意义。为了本质上可更新的观点,必须满足以下条件:
>视图中的每列都必须映射到单个表的列。例如,如果视图列映射到TABLE子句的输出(未抽取的集合),则视图本身不可更新。
>视图不能包含以下任何结构:
>一个集合运算符
>一个DISTINCT运算符
>聚合或分析功能
> GROUP BY,ORDER BY,MODEL,CONNECT BY或START WITH子句
> SELECT列表中的集合表达式
> SELECT列表中的子查询
>一个指定为只读的子查询
>连接,有一些例外,如Oracle数据库管理员指南中所述
另外,如果固有可更新的视图包含伪列或表达式,则不能使用引用任何这些伪列或表达式的UPDATE语句来更新基表行。
如果您希望连接视图可更新,则所有以下条件都必须为true:
> DML语句必须仅影响连接的一个表。>对于INSERT语句,不能使用“查看选项”创建视图,并且插入值的所有列都必须来自保留密钥的表。密钥保留表是在连接视图中基础表中的每个主键或唯一键值也是唯一的。>对于UPDATE语句,必须从保留密钥的表中提取所有更新的列。如果视图是使用检查选项创建的,那么连接从视图中被多次引用的表中取出的列和列必须与UPDATE屏蔽。>对于DELETE语句,如果连接导致多个保留密钥的表,那么Oracle数据库将从FROM子句中指定的第一个表中删除该视图是否已创建WITH CHECK OPTION。