首页 > 解决方案 > 通过连接一个视图和另一个表创建的表所做的更改会影响基于原始表视图吗?

问题描述

假设我在表上创建了一个视图。如果我更改视图中的某些记录,则原始表也会更改。如果我将此视图与另一个表连接并更改我通过连接获得的此结果表上的一些记录,会更改基于哪个视图的原始表吗?

标签: sqloraclejoinvieworacle12c

解决方案


原则上,是的,如果视图的构建方式使得基础表可以通过视图进行更新。例如,假设我有一个名为 TABLE_1 的表并创建一个视图 VIEW_1,如下所示:

CREATE OR REPLACE VIEW VIEW_1 AS
  SELECT *
    FROM TABLE_1

如果我发布更新声明

UPDATE VIEW_1
  SET FIELD_N = 'XYZ'
  WHERE KEY_1 = 123

Oracle 足够聪明,可以将 UPDATE 传递到基础表,并且 TABLE_1 将被更新。

然而,任何复杂的视图很可能包含使视图不可更新的操作。因此,假设我有以下 VIEW_2:

CREATE OR REPLACE VIEW VIEW_2 AS
  SELECT KEY_1,
         FIELD_N,
         SUM(SOME_OTHER_FIELD) AS OTHER_SUM,
         MIN(YADDA_YADDA) AS MIN_YADDA
    FROM TABLE_1
    GROUP BY KEY_1,
             FIELD_N

此视图的更新将失败并出现ORA-01732: data manipulation operation not legal on this view错误。因此,您是否可以通过视图进行更新很大程度上取决于视图正在执行的操作。

db<>在这里摆弄


推荐阅读