Oracle連線檢視DML操作的限制

逍遙三人發表於2012-03-16
轉載:http://space.itpub.net/17032106/viewspace-700171

資料庫視 圖是表的一個延伸物件。從理論上來說,在檢視上使用DML語句對資料進行更新,最終都會在基礎表上完成。也就是說,可以通過檢視對基礎表的內容進行修改。 但是,往往沒有這麼簡單。若想在連線檢視上執行DML修改語句的話,需要嚴格的遵守一些限制。否則的話,DML語句不會執行成功。

假設現在人事管理系統中有三個表,一個是員工基本資訊表,包含員工編號(非空)、員工姓名(非空)、身份證號碼等欄位;第二個表是企業部門職位表包含職位編號(非空)、職位名稱(非空)、職位描述等欄位;第三個是員工與部門職位對應表,包含員工編號(非空)、職位編號(非空)、描述等欄位。

現在資料庫管理員做了一張檢視,查詢員工編號、員工姓名、部門資訊。此時,這張連線檢視可以用DML語句來進行更新呢?這就要看其是否滿足一定的條件。

條件一:在連線檢視中不能有Order by排序語句。

若使用者想要在上面這張檢視中,更改員工所屬的部門,則首先要考慮,在生成檢視的查詢語句中,是否使用了Order by排序語句。若有這個排序語句的話,則在檢視上進行DML操作,是不會成功的。

這主要是因為採用了Order by排序語句後,記錄的物理儲存順序發生了改變。此時,若在檢視上進行了資料更新,則其對應的基礎表找不到具體更改的物理位置。所以,會以失敗告終。

所以,使用者若想在上面這個檢視介面對員工所屬的部門進行更改的話,則一定不能夠在SQL語句中加入Order by等排序語句。類似的,也不能夠在SQL語句中含有Group by、connetc by等語句。若有這些語句的話,則資料庫都不允許對資料進行資料更新操作。

條件二:基礎表中所有的NOT NULL列都必須在這個檢視中。

若想在檢視上進行資料更新操作的話,則必須要求對應基礎表中的所有不允許空的欄位都在當前的檢視中。其實這很好理解,若每個欄位不允許為空,則又不在當前的檢視中,則新增加記錄的時候,這個欄位就沒有被賦值,故在儲存時就會被基礎表所拒絕。

在上面這個例子中,資料庫管理員若建立的檢視沒有包含所有的非空欄位。如企業部門職位表總的職位編號就沒有在這個檢視中。所以,資料庫不會接納這張檢視上的更新。若使用者確實需要在這張檢視上更新資料,則就要考慮把所有的非空欄位顯示在這張檢視上。

另 外,需要注意的是,無論是更新還是刪除語句,若基礎表中的某個非空列不在這個檢視中,都無法進行更改。也許有人會問,如果使用者不是增加記錄,而只是更新數 據。那難道也要求在檢視中包含所有的非空欄位呢?答案是肯定的。因為資料庫系統在提交更新事務之前就會對這個條件進行判斷。

條件三:需要更新的列不是虛擬列。

在 檢視中,可能有些列的結果是通過列表示式定義的,在基礎表中並不存在。我們把這些列叫做虛擬列。如在上面的員工資訊表中,並沒有員工的出生年月資訊。而在 檢視中,我們可以通過身份證號碼來取得某個員工的出生日期。此時若想在檢視中更改這個出生日期,則很明顯是不行的。因為基礎表中根本沒有這個欄位,那更改 的結果就無法儲存。

只要在檢視中有虛擬列的存在,只要檢視中任何一列是由列表示式定義的,那麼對不起,整張檢視都不能夠進行更改。這個控制原理跟上面這個條件是類似的。

可見,在資料庫設計的時候,就需要考慮是否需要在檢視基礎上對錶的內容進行更改。若需要更改的話,則一定不能夠在檢視中採用虛擬列,而寧願在表中多增加一些欄位。或者在資料庫檢視中不採用虛擬列,而是在前臺應用程式中採用虛擬列。

條件四:不能夠具有分組函式。

如上面這張員工與職位的對應關係表中,使用者不但想知道某個職位現有的員工有哪些;還希望知道,某個職位現在員工的具體人數。要實現這個需求的話,則資料庫管理員就需要在檢視中採用分組函式,來統計某個職位的具體人數。

但是,若檢視中有這個函式的話,則也不能夠對這張檢視進行更新。這是Oracle資料庫的強制規定。

其 實,這也可以通過一些靈活的方式來避免。如在資料庫檢視中不需要採用分組函式。而是在前臺的Select語句中,查用分組函式。因為前臺要呼叫資料庫中的 資料,仍然需要查用Select語句去查詢檢視。所以,即使在原始的資料庫檢視中不對資料進行分組,則在前臺應用程式中仍然可以幫助使用者完成資料分組與統 計的任務。此時,使用者若在檢視中更改資料的話,不僅可以更新資料庫基礎表中的內容;而且,還可以及時的反饋到前臺的應用程式介面中。

分組函式會增加資料庫查詢的負擔;同時,使得無法在檢視上採取DML操作。故資料庫管理人員需要跟前臺應用程式開發人員進行協商,在前臺實現對資料的分組統計,而不是在後臺。

除了以上幾個限制條件之外,若需要在檢視上進行DML操作的話,則在建立檢視的Select語句中,還不能夠有集合運算子、子查詢等等。以上這些是一些必須要滿足的基本條件,缺一不可。否則的話,針對檢視的DML操作,就會以失敗告終。

但是,並不是說符合了上面這個幾個條件後,檢視就可以暢所無阻的進行資料更新了,其仍然必須符合一定的規則。這其中,最重要的就是鍵值儲存表規則。

如果連線檢視中的一個基礎表的鍵在他的檢視中仍然存在,並且在連線檢視中仍然是主鍵,則這個基礎表就為鍵值儲存表。在連線檢視上,對檢視進行插入、刪除、更新等操作時,一次只能夠對檢視中的一個鍵值儲存表進行更新。

參考:http://hi.baidu.com/bystander1983/blog/item/27e92b01cfa34d1b728b6520.html

檢視上的DML 操作:
DML操作應遵循的原則:
1.簡單檢視可以執行DML操作;
2.在檢視包含GROUP 函式,GROUP BY子句,DISTINCT關鍵字時不能刪除資料行;
3.在檢視不出現下列情況時可通過檢視修改基表資料或插入資料:
  a.檢視中包含GROUP 函式,GROUP BY子句,DISTINCT關鍵字;
  b.使用表示式定義的列;
  c.ROWNUM偽列。
  d.基表中未在檢視中選擇的其他列定義為非空且無預設值。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21584437/viewspace-718734/,如需轉載,請註明出處,否則將追究法律責任。

相關文章