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

In Oracle, is it possible to INSERT or UPDATE a record through a view?(在 Oracle 中,是否可以通过视图插入或更新记录?)
本文介绍了在 Oracle 中,是否可以通过视图插入或更新记录?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

In Oracle, is it possible to INSERT or UPDATE a record (a row) through a view?

推荐答案

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

Views in Oracle may be updateable under specific conditions. It can be tricky, and usually is not advisable.

来自 Oracle 10g SQL 参考:

关于可更新视图的说明

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

An updatable view is one you can use to insert, update, or delete base table rows. You can create a view to be inherently updatable, or you can create an INSTEAD OF trigger on any view to make it updatable.

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

To learn whether and in what ways the columns of an inherently updatable view can be modified, query the USER_UPDATABLE_COLUMNS data dictionary view. The information displayed by this view is meaningful only for inherently updatable views. For a view to be inherently updatable, the following conditions must be met:

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

    此外,如果本质上可更新的视图包含伪列或表达式,则不能使用引用这些伪列或表达式中的任何一个的 UPDATE 语句更新基表行.

    In addition, if an inherently updatable view contains pseudocolumns or expressions, then you cannot update base table rows with an UPDATE statement that refers to any of these pseudocolumns or expressions.

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

    If you want a join view to be updatable, then all of the following conditions must be true:

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

    这篇关于在 Oracle 中,是否可以通过视图插入或更新记录?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Execute complex raw SQL query in EF6(在EF6中执行复杂的原始SQL查询)
Hibernate reactive No Vert.x context active in aws rds(AWS RDS中的休眠反应性非Vert.x上下文处于活动状态)
Bulk insert with mysql2 and NodeJs throws 500(使用mysql2和NodeJS的大容量插入抛出500)
Flask + PyMySQL giving error no attribute #39;settimeout#39;(FlASK+PyMySQL给出错误,没有属性#39;setTimeout#39;)
auto_increment column for a group of rows?(一组行的AUTO_INCREMENT列?)
Sort by ID DESC(按ID代码排序)