2009-10-31 96 views

回答

38

Oracle中的视图可能在特定条件下可更新。这可能会非常棘手,通常不建议使用

Oracle 10g SQL Reference

注意事项可更新视图

更新视图是一个可以用来插入,更新或删除基表行。您可以创建一个视图以固有更新,或者您可以在任何视图上创建INSTEAD OF触发器以使其可更新。

要了解是否以及如何修改固有可更新视图的列,请查询USER_UPDATABLE_COLUMNS数据字典视图。此视图显示的信息仅对固有可更新的视图有意义。为了本质上更新视图,必须满足以下条件:

  • 视图中的每一列必须映射到单个表的列。例如,如果一个视图列映射到一个TABLE子句的输出(一个非内置集合),那么这个视图并不是固有的可更新的。
  • 视图必须不包含任何下列构建体:
    • 一组操作者
    • DISTINCT运算符
    • 一个聚集或解析函数
    • 甲GROUP BY,ORDER BY,MODEL,CONNECT BY或WITH子句
    • START在SELECT列表
    • 在SELECT列表中的子查询的集合表达
    • WITH READ指定的子查询ONLY
    • 加入,也有一些例外,如Oracle数据库管理员指南

此外中记录,如果固有可更新视图包含伪列或表达式,那么你就不能更新基地使用引用任何这些伪列或表达式的UPDATE语句的表行。

如果你想连接视图是可更新的,那么所有的以下条件必须为真:

  • 的DML语句必须影响只有一个表背后的加入。
  • 对于INSERT语句,不得使用WITH CHECK OPTION创建视图,并且插入值的所有列必须来自保存键的表。保存键的表格是基表中的每个主键或唯一键值在连接视图中都是唯一的。
  • 对于UPDATE语句,所有更新的列必须从保存键的表中提取。如果视图是使用WITH CHECK OPTION创建的,那么连接从视图中多次引用的表中获取的列和列必须从UPDATE屏蔽。
  • 对于DELETE语句,如果连接生成多个保留键的表,那么Oracle数据库将从FROM子句中指定的第一个表中删除该视图是否已创建WITH CHECK OPTION。
3

有两个时候,你可以通过视图更新记录:

  1. 如果视图没有加入或过程调用,并从一个底层表中选择数据。
  2. 如果视图有与视图关联的INSTEAD OF INSERT trigger

一般来说,除非您专门为它编写了INSTEAD OF触发器,否则不应该依赖于能够对视图执行插入操作。请注意,INSTEAD OF UPDATE触发器也可以写入以帮助执行更新。

+2

大部分都是如此,但在某些情况下可以更新连接视图。 – DCookie 2009-10-31 02:20:18

9

甲骨文使视图都可以更新的两种不同的方式: -

  1. 的观点是“重点保障”相对于您要更新什么。这意味着基础表的主键在视图中,并且该行在视图中只出现一次。这意味着Oracle可以确切地确定要更新哪个基础表行。或者您可以编写而不是触发器。

我会远离代替触发器,并让您的代码直接更新底层表而不是通过视图。

+0

在这两个条件之间是否有'and'或者'or'? (对我来说,这听起来像两个独立的想法.. – Thorsten 2009-11-01 21:28:17

+0

它是或者。 – DCookie 2009-11-02 14:50:04

0

YES,您可以更新和插入到视图和编辑将反映在原始表 ....

1 - 视图所应有的一切NOT NULL表上的值
2-更新应该有与表相同的规则......“更新与其他外键相关的主键......等等......”

相关问题