單表的視圖, 默認是可以修改數據的。
例如 下面這樣的視圖:
SQL>?CREATE?VIEW
2V_SALE_REPORT 3?AS 4SELECT 5?* 6FROM 7?SALE_REPORT;View?created.
SQL>?INSERT?INTO?v_sale_report?(
2sale_date,?sale_item,?sale_money 3?)?VALUES?( 4TO_DATE('2012.01.01',?'YYYY.MM.DD'),?'X',?1 5?);1?row?created.
SQL>?alter?session?set?NLS_DATE_FORMAT="YYYY.MM.DD";
Session?altered.
SQL>?SELECT
2* 3?FROM 4sale_report 5?WHERE 6sale_date?=?TO_DATE('2012.01.01',?'YYYY.MM.DD');SALE_DATE?SALE?SALE_MONEY
----------?----?----------
2012.01.01?X?1
WITH READ ONLY 選項, 將默認的 “可修改” 關閉掉
SQL>?CREATE?VIEW 2v_sale_report_read_only 3?AS 4SELECT 5?* 6FROM 7?sale_report 8?WITH?READ?ONLY;View?created.
SQL>?INSERT?INTO?v_sale_report_read_only?(
2sale_date,?sale_item,?sale_money 3?)?VALUES?( 4TO_DATE('2012.02.02',?'YYYY.MM.DD'),?'X',?1 5?); sale_date,?sale_item,?sale_money *ERROR?at?line?2:
ORA-01733:?virtual?column?not?allowed?here
WITH CHECK OPTION ? 選項, ?是 ?“約束可更新”
SQL>?CREATE?VIEW
2v_sale_report_x 3?AS 4SELECT 5?* 6FROM 7?sale_report 8WHERE 9?sale_item?=?'X' 10?WITH?CHECK?OPTION;View?created.
SQL>?INSERT?INTO?v_sale_report_x?(
2sale_date,?sale_item,?sale_money 3?)?VALUES?( 4TO_DATE('2012.02.02',?'YYYY.MM.DD'),?'X',?1 5?);1?row?created.
SQL>
SQL>
SQL>?INSERT?INTO?v_sale_report_x?(
2sale_date,?sale_item,?sale_money 3?)?VALUES?( 4TO_DATE('2012.02.02',?'YYYY.MM.DD'),?'Y',?1 5?);INSERT?INTO?v_sale_report_x?(
*
ERROR?at?line?1:
ORA-01402:?view?WITH?CHECK?OPTION?where-clause?violation
上面是 ?單表的視圖的情況。
下面是?單表統計視圖 的情況。
這種 視圖裏面, 使用到了 SUM () 的, 默認情況下, 是不能 ?插入,更新,刪除處理了。
要通過 INSTEAD OF 關鍵字實現視圖的觸發器來實現了
SQL>?CREATE?VIEW
2v_sale_report_sum 3?AS 4?SELECT 5sale_item, 6SUM(sale_money)?AS?sale_money 7?FROM 8sale_report 9?GROUP?BY 10sale_item;View?created.
SQL>?SELECT?*?FROM?v_sale_report_sum;
SALE?SALE_MONEY
----?----------
A733285
B?2382
C?5738
X?1
SQL>?DELETE?FROM?v_sale_report_sum?WHERE?sale_item?=?'X';
DELETE?FROM?v_sale_report_sum?WHERE?sale_item?=?'X'
*
ERROR?at?line?1:
ORA-01732:?data?manipulation?operation?not?legal?on?this?view
SQL>?CREATE?OR?REPLACE?TRIGGER?v_sale_report_trigger
2?INSTEAD?OF 3?DELETE?ON?v_sale_report_sum 4?FOR?EACH?ROW 5?BEGIN 6DELETE?FROM?sale_report?WHERE?sale_item?=?:old.sale_item; 7?END; 8?/Trigger?created.
SQL>?DELETE?FROM?v_sale_report_sum?WHERE?sale_item?=?'X';
1?row?deleted.
SQL>?SELECT?*?FROM?v_sale_report_sum;
SALE?SALE_MONEY
----?----------
A733285
B?2382
C?5738