Oracle連線檢視DML操作的限制
資料庫視 圖是表的一個延伸物件。從理論上來說,在檢視上使用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
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21584437/viewspace-718734/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle 檢視可以DML操作的條件Oracle
- 檢視Oracle連線數Oracle
- 檢視並修改oracle最大連線數Oracle
- ORACLE檢視並修改最大連線數Oracle
- 檢視oracle資料庫的連線數以及使用者檢視Oracle資料庫
- Oracle檢視允許的最大連線數和當前連線數Oracle
- oracle 監控 DML DDL 鎖 的4個檢視Oracle
- oracle檢視基本操作Oracle
- oracle檢視允許的最大連線數和當前連線數等資訊Oracle
- DBA ORACLE連線操作Oracle
- java操作Oracle 方式一 ( 連線-》操作-》斷開連線 )JavaOracle
- 檢視sqlserver連線數SQLServer
- 檢視連線端IP
- 遠端桌面會話連線限制操作步驟會話
- 檢視Linux連線數Linux
- 檢視使用者連線
- Oracle並行操作——並行DML操作Oracle並行
- Oracle查詢轉換(三)外連線檢視合併Oracle
- Oracle表連線操作——Hash Join(雜湊連線)下Oracle
- Oracle表連線操作——Hash Join(雜湊連線)上Oracle
- MYSQL 檢視最大連線數和修改最大連線數MySql
- 檢視使用 MySQL Shell 的連線狀態MySql
- windows 檢視已連線的wifi密碼WindowsWiFi密碼
- 【ORACLE】物化檢視快速重新整理限制條件Oracle
- Oracle 物化檢視 快速重新整理 限制 說明Oracle
- 詳解nginx的請求限制(連線限制和請求限制)Nginx
- linux 檢視伺服器的連線數Linux伺服器
- 檢視網路連線數netstat -an
- 檢視系統網路連線資訊
- Linux下檢視Nginx的併發連線數和連線狀態LinuxNginx
- MySql 限制連線程式數MySql線程
- Oracle表連線操作——Merge Sort Join(合併排序連線)Oracle排序
- 關於ORACLE I/O操作的幾個檢視Oracle
- Oracle dos連線資料庫基本操作Oracle資料庫
- C#連線和操作Oracle資料C#Oracle
- 檢視已連線過的 Wi-Fi 密碼密碼
- ss:檢視網路連線的另一種方法
- oracle透過trigger來限制使用者和ip連線資料庫的限制Oracle資料庫