Oracle
將數據插入到 VIEW 中,導致數據被插入到原始表中,為什麼會發生這種情況?
我有一張表,如下所示:
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 中,該語句將失敗。