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



我在谷歌上搜索了上面的问题,得到了以下答案

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

否---->如果是复杂视图(由多个基表和联接组成)。

但是,有一种间接的方法可以在复杂视图上执行DML操作,方法是使用"替代触发器"。在"代替触发器"的正文中,我们将使用共关系标识符和DML语句对复杂视图间接执行DML操作。然后,这些更改将反映在该特定复杂视图的基表中。

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

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

有人能给我举一下上述情况的例子吗?

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

来自:Oracle数据库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语句,视图不能创建为WITH CHECKOPTION,并且插入值的所有列必须来自保留关键字的表。保留关键字的表基表中的主键或唯一键值在中也是唯一的join视图

    对于UPDATE语句,所有更新的列都必须从保留关键字的表。如果视图是用CHECK OPTION创建的,则联接列和取自引用较多的表的列视图中的一次以上必须屏蔽UPDATE

  • 对于DELETE语句,如果联接导致多个保留键的表,则无论视图是否是用WITH CHECK OPTION创建的,Oracle Database都会从from子句中命名的第一个
    表中删除。

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

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

  • 不能基于联合查询直接修改视图中的数据。不能修改使用GROUP BY或DISTINCT语句的视图中的数据。

  • 所有被修改的列都受到相同的限制,就好像直接对基执行语句一样桌子

  • 无法通过视图修改文本和图像列。

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

最新更新