代码之家  ›  专栏  ›  技术社区  ›  Bastien Vandamme

在Oracle中,是否可以通过视图插入或更新记录?

  •  30
  • Bastien Vandamme  · 技术社区  · 15 年前

    在Oracle中,是否可以通过视图插入或更新记录(行)?

    4 回复  |  直到 8 年前
        1
  •  42
  •   DCookie    15 年前

    Oracle视图 可以 在特定条件下可更新。这可能很棘手,而且 通常 不可取。

    Oracle 10g SQL Reference :

    关于可更新视图的注释

    可更新视图是可用于插入、更新或删除基表行的视图。您可以创建一个内在可更新的视图,也可以在任何视图上创建一个instead-of-trigger,使其可更新。

    要了解是否可以修改固有可更新视图中的列,以及如何修改这些列,请查询用户的“可更新列数据字典”视图。此视图显示的信息仅对固有的可更新视图有意义。要使视图具有固有的可更新性,必须满足以下条件:

    • 视图中的每一列都必须映射到单个表中的一列。例如,如果视图列映射到table子句(未列出的集合)的输出,则该视图本身不可更新。
    • 视图不能包含以下任何构造:
      • 集合算子
      • 不同的运算符
      • 聚合函数或分析函数
      • group by、order by、model、connect by或start with子句
      • 选择列表中的集合表达式
      • 选择列表中的子查询
      • 用只读指定的子查询
      • 联接,除了一些例外,如《Oracle数据库管理员指南》中所述

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

    如果希望联接视图可更新,则以下所有条件都必须为真:

    • DML语句只能影响联接的一个表。
    • 对于INSERT语句,不能使用CHECK选项创建视图,插入值的所有列必须来自保留键的表。保留键的表是基表中的每个主键或唯一键值在联接视图中也是唯一的表。
    • 对于UPDATE语句,必须从保留键的表中提取所有已更新的列。如果使用check选项创建视图,则必须屏蔽从视图中多次引用的表中获取的联接列和列,以防更新。
    • 对于DELETE语句,如果联接导致多个保留键的表,则Oracle数据库将从FROM子句中指定的第一个表中删除,无论该视图是否使用CHECK选项创建。
        2
  •  10
  •   WW.    15 年前

    Oracle有两种使视图可更新的方法:

    1. 视图是关于您要更新的内容的“保留键”。这意味着基础表的主键在视图中,并且该行在视图中只出现一次。这意味着Oracle可以精确地确定要更新的基础表行,或者
    2. 你写了一个代替触发器。

    我将远离触发器,让您的代码直接更新基础表,而不是通过视图。

        3
  •  3
  •   WW.    15 年前

    有两次可以通过视图更新记录:

    1. 如果视图没有联接或过程调用,并且从单个基础表中选择数据。
    2. 如果视图有 INSTEAD OF INSERT trigger 与视图关联。

    通常,您不应该依赖于能够对视图执行插入操作,除非您专门为视图编写了INSTEADOF触发器。请注意,还可以编写更新触发器来帮助执行更新。

        4
  •  0
  •   Radi Soufan    9 年前

    ,您可以更新并插入到视图中,该编辑将 反映在原始表上
    但是
    1-视图应包含所有 非空 表中的值
    2-更新应具有 与表相同的规则 ……”正在更新与其他外键相关的主键。等等……