可以更新/插入/删除视图吗?如果是,在什么条件下?

时间:2017-11-15 00:26:11

标签: sql database oracle11g tableview

我在上面搜索了问题并得到了以下答案

YES - >如果是简单视图的情况(只包含一个基表)。

否---->如果是复杂视图(包含多个基表和连接)。

但是,通过使用“而不是触发器”,可以间接地在复杂视图上执行DML操作。在代替触发器的主体中,我们将使用共同关系标识符和DML语句间接地在复杂视图上执行DML操作。然后,这些更改将反映在该特定复杂视图的基表中。

这里我的问题是应用于视图的更改是否会对原始表产生任何影响?

如果操作单个基表上的视图,更改是否会反映在基表上?

任何人都可以举例说明上述情况吗?

1 个答案:

答案 0 :(得分:2)

Oracle 中,您可以在以下条件下更新视图:

来自:Oracle database SQL Reference

  

有关可更新视图的说明

     

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

     

了解是否以及以何种方式固有的列   可以修改可更新视图,查询USER_UPDATABLE_COLUMNS数据   字典视图。此视图显示的信息很有意义   仅适用于固有可更新的视图。为了一个内在的观点   可更新,必须满足以下条件:

     
      
  • 视图中的每个列都必须映射到单个表的列。例如,如果视图列映射到TABLE子句的输出(一个
      unnested collection),然后视图本身不可更新。
  •   
  • 视图不得包含以下任何构造:

         

    集合运算符

         

    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子句中命名的表,无论视图是否已创建
      选择检查选项。

  •   

SQL Server 中,您可以在视图中插入,更新和删除行,但受以下限制Source

  
      
  • 如果视图包含多个表之间的连接,则只能在视图中插入和更新一个表,并且不能删除行。

  •   
  • 您无法根据联合查询直接修改视图中的数据。您无法修改使用GROUP BY或DISTINCT语句的视图中的数据。

  •   
  • 所有正在修改的列都受到相同的限制,就像语句直接针对基类执行一样   表

  •   
  • 无法通过视图修改文字和图片列。

  •   
  • 没有检查查看条件。例如,如果视图选择所有居住在巴黎的客户,并且数据被修改为
      添加或编辑没有City ='Paris'的行,数据
      将在基表中修改但未在视图中显示,除非
      定义视图时使用WITH CHECK OPTION。

  •