1. 程式人生 > >對檢視進行 DML 操作

對檢視進行 DML 操作

    以前只知道檢視可以用來查詢,最近才知道,原來檢視還是可以像普通表一樣進行增、刪、改操作的。而我們通常用寫的檢視雖然僅僅只是用來進行查詢,而且在建立查詢檢視的時候,我們從來沒有考慮到將檢視建立成只讀格式,我意識到,事實上我們的檢視是不安全的。
接下來,我將詳細說明如何對檢視進行資料的新增、修改和刪除。
在切入主題之前,首先說明一下檢視的格式定義:

CREATE [OR REPLACE][FORCE|NOFORCE] VIEW YOUR_VIEW_NAME
        (COLNAME1,COLNAME2,COLNAME3,...,COLNAMEn)
AS
        [YOUR_QUERY_STATEMENTS WILL WRITE HERE !]
        [WITH CHECK OPTION [CONSTRAINTNAME constraint_name]]
        [WITH READ ONLY]

說明:
    首先我想說一下 FORCE 與 NOFORCE 的區別,有時候你在建立檢視時可能會報一個“表或檢視”不存在的錯誤。如果選擇了 FORCE 選項,不論你的 SQL 是否有問題,只要符合語法規則,Oracle 都會按照你的意圖將其建立。這樣你就可以在檢視建立好以後再建表,或者向表中加欄位。
其次就是 WITH CHECK OPTION ,這個條件一般對於查詢類檢視是沒有太大的用途的。但是如果你要執行DML操作,那麼,這個檢查將會限制你只能訪問被 Where 子句所限制了的記錄。更或者確切的說,如果你所執行的操作影響到檢視中的一條記錄不再滿足檢視的限制條件,那麼,Oracle 就不會允許你進行該操作。這樣,事實上就保證了檢視中資料的完整性。
最後,也是最重要,用來保證檢視安全性的 WITH READ ONLY 指令。預設情況下,Oracle中的檢視如果沒有申明只讀,理論上都可以執行DML操作。因此,如果要保證你的檢視是隻讀的,那就應該顯式宣告一下。其實,如果業務上沒有在檢視上執行 DML 操作的需求的話,一般建議在建立檢視時都將其宣告為只讀格式的,這樣不但保證了檢視中資料不會被非法修改,而且從一定程度上還可以提升檢視的執行效率。

    說了半天的閒話,我們現在開始聊聊如何對檢視執行DML操作。如果是簡單檢視,而且沒有宣告 WITH READ ONLY 那你就放心大膽的執行吧,沒什麼不行的,為了說明問題,我們先小試牛刀。



一:簡單檢視執行的 DML 操作

首先,將設庫中已經有Dept這張表,我們建一個檢視,命名為 V_Dept ,定義過程如下:

1>用到的表定義:
CREATE TABLE DEPARTMENT
(
  DEPARTMENTID  VARCHAR2(32 BYTE)               NOT NULL,
  NAME          VARCHAR2(32 BYTE)               NOT NULL,
  INNERCODE     VARCHAR2(3 BYTE)                NOT NULL,
  FULLNAME      VARCHAR2(32 BYTE),
  STATUS        VARCHAR2(1 BYTE)                NOT NULL,
  COMMENTS      VARCHAR2(100 BYTE)
)

2>檢視定義:
    CREATE OR REPLACE VIEW V_Dept
    AS SELECT * FROM DEPT

    從定義中可以看出,事實上我們這裡的定義方式跟 Oracle 檢視定義的標準格式還有些出入,不過沒關係,Oracle 在遇到沒有定義欄位名的檢視時他會自動將原表中的欄位名稱當做檢視的欄位名稱。執行編譯,系統提示view created 。OK,我們接下來對這個簡單檢視進行資料的修改、增加和刪除。

首先我們對檢視進行一次資料查詢,執行如下:
select * from v_dept
返回訊息>>11 rows return

OK , 首先保證我們的表中有資料(沒有資料的仁兄們就得自己想辦法嘍^^)。然後小試牛刀讓我們來執行一條插入語句:
Insert into v_dept
   (DEPARTMENTID, NAME, INNERCODE, FULLNAME, STATUS, COMMENTS)
 Values
   ('SP13618d5cWWWWW', '後勤公司', '17', '後勤服務公司', '0', '主要用於教學場地的管理');
COMMIT;
返回訊息>>1 row inserted

OK , 說明簡單檢視可以執行插入語句,接下來我們再試一下修改語句,我們同樣還是修改剛才插入的這條記錄:
修改:update v_dept set DEPARTMENTID='SP13618d5c' where DEPARTMENTID='SP13618d5cWWWWW';
刪除:delete v_dept where DEPARTMENTID='SP13618d5c'
執行上面的兩條語句,我們可以看到對於簡單檢視我們可以像對真實表一樣進行 DML 操作。那麼對於複雜檢視呢?

二:複雜檢視在有條件的情況下執行 DML 操作。

具體的限制條件如下:
1〉不允許違反約束的 DML 操作。
2〉不能將一個值新增到包含算術表示式的列中
3〉在非 key-preserved 表上不允許 DML 操作 .
4〉在包含組函式、GROUP BY 子句、ROWNUM偽列或DISTINCT關鍵字的檢視上不允許 DML 操作。

>>未完待續....