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

问题描述 投票:2回答:1

我搜索了上面的问题并获得了以下答案

是 - >如果是简单视图(仅包含一个基表)。

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

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

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

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

任何人都能举例说明以上案例吗?

sql database oracle11g tableview
1个回答
2
投票

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

来自:Oracle database SQL Reference

有关可更新视图的说明

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

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

  • 视图中的每个列都必须映射到单个表的列。例如,如果视图列映射到TABLE子句的输出(an 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。
© www.soinside.com 2019 - 2024. All rights reserved.