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

Bas*_*mme 33 sql oracle plsql views

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

DCo*_*kie 43

Oracle中的视图可以在特定条件下更新.它可能很棘手,通常是不可取的.

Oracle 10g SQL参考:

有关可更新视图的说明

可更新视图是可用于插入,更新或删除基表行的视图.您可以创建一个本质上可更新的视图,或者您可以在任何视图上创建一个INSTEAD OF触发器以使其可更新.

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

  • 视图中的每个列都必须映射到单个表的列.例如,如果视图列映射到TABLE子句(未引入的集合)的输出,则视图本身不可更新.
  • 视图不得包含以下任何构造:
    • 一组运算符
    • 一个DISTINCT运算符
    • 聚合或分析函数
    • GROUP BY,ORDER BY,MODEL,CONNECT BY或START WITH子句
    • SELECT列表中的集合表达式
    • SELECT列表中的子查询
    • 指定WITH READ ONLY的子查询
    • 如Oracle数据库管理员指南中所述,加入了一些例外情况

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

如果希望连接视图可更新,则必须满足以下所有条件:

  • DML语句必须仅影响连接下的一个表.
  • 对于INSERT语句,不能使用CHECK OPTION创建视图,并且插入值的所有列必须来自密钥保留表.密钥保留表是基表中的每个主键或唯一键值在连接视图中也是唯一的.
  • 对于UPDATE语句,必须从保留密钥的表中提取更新的所有列.如果视图是使用CHECK OPTION创建的,那么连接列和从视图中多次引用的表中获取的列必须屏蔽UPDATE.
  • 对于DELETE语句,如果连接导致多个密钥保留表,则Oracle数据库将从FROM子句中指定的第一个表中删除,无论该视图是否是使用CHECK OPTION创建的.


WW.*_*WW. 10

Oracle有两种不同的方法可以更新视图: -

  1. 对于您要更新的内容,视图是"密钥保留".这意味着基础表的主键位于视图中,并且该行仅在视图中出现一次.这意味着Oracle可以确切地确定要更新的基础表行OR
  2. 你写了一个而不是触发器.

我会远离替代触发器并让您的代码直接更新基础表而不是通过视图.


LBu*_*kin 5

有两种情况可以通过视图更新记录:

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

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

  • 大多数情况下是正确的,但在某些情况下可以更新连接视图。 (2认同)