Oracle

將數據插入到 VIEW 中,導致數據被插入到原始表中,為什麼會發生這種情況?

  • September 16, 2021

我有一張表,如下所示:

create table table_test
(col_id   number(1))

該表有以下數據:

col_id
------
 1
 2
 3

我基於此表創建了一個視圖:

create view v_table_test as
select *
from table_test;

然後我執行這個查詢,在 中插入一行VIEW

insert into v_table_test 
values(1);

 commit;

然後我的表中有這些數據:

col_id
------
 1
 2
 3
 1

我以前從未見過甚至聽說過(我的同事也沒有!)如果我們在其中插入數據VIEW,則該值將被插入到原始表中!我想知道為什麼會發生這種情況以及為什麼 DBMS 不阻止這種情況發生?我希望 DBMS 肯定會阻止這種情況!有人可以解釋一下嗎?

提前致謝

如果您希望視圖是只讀的,您可以使用以下with read only選項:

create or replace view v_table_test as
select *
from table_test
with read only;
insert into v_table_test values(1)
*
ERROR at line 1:
ORA-42399: cannot perform a DML operation on a read-only view

否則,為什麼你不能在視圖上執行任何你想要的 DML?這也適用於內聯視圖,例如

insert into (select col_id from table_test) values (1)
update (select col_id from table_test) set col_id = 2

這是一個正確的行為,當您創建一個引用一個表的視圖,並且該視圖的結構包含該表的每個受插入語句約束的欄位時,插入操作可以工作,並且打算發生,由於視圖變成了維護視圖,想像一下,與其將表的整個定義提供給開發人員,不如給他們視圖。

想像以下場景:

CREATE TABLE TEMP1(
   FIELD_1   INT,
   FIELD_2   VARCHAR2(10) NOT NULL
);

然後你創建你的視圖:

CREATE VIEW V_TEMP1 AS
SELECT FIELD_1 FROM TEMP1;

如果您嘗試插入到此 VIEW 中,該語句將失敗。

引用自:https://dba.stackexchange.com/questions/299614