Oracle 更新视图是否会影响基表?

Oracle 更新视图是否会影响基表?,oracle,view,Oracle,View,当我更新使用基表创建的视图时,更新也会影响基表。这怎么可能?如果视图仅被视为一个“窗口”,通过它我们可以看到基表的一组数据,那么当我尝试更改视图中的数据时,基表如何更改。在某些数据库中,可以更新源表对于视图,如果视图中的行与基础表中的行之间存在一对一关系,例如,视图中不能有派生列、聚合函数或distinct子句 在Oracle中,即使视图本身不可更新,如果定义了,也可能允许更新 如果您使用mysql,您可以阅读有关此功能的详细说明。您可以使用该视图更改基础表的状态,只要您的目标是单个表中的更改

当我更新使用基表创建的视图时,更新也会影响基表。这怎么可能?如果视图仅被视为一个“窗口”,通过它我们可以看到基表的一组数据,那么当我尝试更改视图中的数据时,基表如何更改。

在某些数据库中,可以更新源表对于视图,如果视图中的行与基础表中的行之间存在一对一关系,例如,视图中不能有派生列、聚合函数或distinct子句

在Oracle中,即使视图本身不可更新,如果定义了,也可能允许更新


如果您使用mysql,您可以阅读有关此功能的详细说明。

您可以使用该视图更改基础表的状态,只要您的目标是单个表中的更改

视图是表对象顶部的一个安全层,只要您不遵守基本规则,它就允许大多数DML操作

例如:

创建表T1 (ID-INT-IDENTITY(1,1),[Value]NVARCHAR(50))

创建表T2 (ID-INT-IDENTITY(1,1),[Value]NVARCHAR(50))

--虚拟插入 插入到T1值中('TestT1')

插入T2值('TestT2')

--创建视图
创建视图V1 作为 从T1内部联接T2中选择T1.ID作为T1ID,T2.ID作为T2ID,T1.Value作为T1Value,T2.Value作为T2Value 在T2.ID=T1.ID上

--检查结果
从V1中选择*

--只要Insert只影响一个表,就可以通过view进行插入

插入到V1(T1Value)值中 ('TestT1_T1')

插入到V1(T2Value)值中 ('TestT2_T2')

--仅当目标仅为一个表时,才可能进行更改 更新V1 SET T1Value='Changed'--** 其中T2ID=1

--这是不允许的 插入到V1(T1Value,T2Value)值中 ('TestT1_T1','TestT2_T2')

--Msg 4405,16级,状态1,第1行 --视图或函数“V1”不可更新,因为修改会影响多个基表

--用每个语句检查T1和T2,看看它是如何受到影响的

--“如果视图被视为一个“窗口”,通过它我们可以看到基表的一组数据” -你从哪里得到这个定义的

oracle对视图的看法:

视图是另一个表或其组合的逻辑表示 桌子。视图从其所基于的表中派生数据。 这些表称为基表。基表可能依次是 实际的表或视图本身可能是。执行的所有操作 在视图上,实际上会影响视图的基表。你可以用 视图的方式与表几乎相同。您可以查询、更新、插入 在视图中插入和删除,就像在标准表中一样

这种可以更新或插入的视图被亲切地命名为“可更新和可插入视图”。关于它们的Oracle文档是

此外,Oracle是如何定义“insert”语句的目的的:

使用INSERT语句将行添加到表中,表是 视图,已分区表的分区或 复合分区表,或对象表或 对象视图


是的,我们可以在如下视图中实现DML操作:

Create or replace view emp_dept_join as   Select d.department_id,  
d.department_name, e.first_name, e.last_name from employees
e, departments d where  e.department_id = d.department_id;   

SQL>CREATE OR REPLACE TRIGGER insert_emp_dept
      INSTEAD OF INSERT ON emp_dept_join DECLARE v_department_id     departments.department_id%TYPE; 
BEGIN 
    BEGIN
    SELECT department_id INTO v_department_id
    FROM   departments
    WHERE  department_id = :new.department_id;
 EXCEPTION
    WHEN NO_DATA_FOUND THEN
      INSERT INTO departments (department_id, department_name)
             VALUES (dept_sequence.nextval, :new.department_name)
             RETURNING ID INTO v_department_id; 
    END;
  INSERT INTO employees (employee_id, first_name, last_name, department_id)
         VALUES(emp_sequence.nextval, :new.first_name, :new.last_name, v_department_id); 
END insert_emp_dept;
/

如果viwe是通过涉及单个基关系的简单查询定义的,并且包含主键或候选键,那么如果更改视图,则基关系将发生更改。(但有限制) 如果存在多个基本关系或分组操作,则不允许通过视图进行更新