當前位置:編程學習大全網 - 源碼下載 - oracle 的view 為什麽可以修改、新增到源數據?求解。謝謝!

oracle 的view 為什麽可以修改、新增到源數據?求解。謝謝!

單表的視圖, 默認是可以修改數據的。

例如 下面這樣的視圖:

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

  • 上一篇:HTML5 新增加了哪些表單元素
  • 下一篇:觀看rtos源代碼
  • copyright 2024編程學習大全網