數據庫視圖(oracle)

使用數據庫視圖通常出於以下兩個目的:1。降低操作複雜度;視圖是預編譯的查詢操作,一次定義,之後可快速調用;2。提高系統安全。視圖作爲數據庫對象,可以將其權限獨立出來賦給用戶,可避免用戶對基表的盲目危險操作,同時也可屏蔽一部分私密的屬性列。

定義語句:

 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 ]

對視圖的查詢操作實際是運行建立視圖的sql語句。所以當用戶自己修改基表信息時,主表改變,查詢視圖時也同時輸出最新的信息,這樣做可以儘可能減少對數據庫空間的佔用,並且不需要同步操作。

視圖也可進行DML操作,但是在操作時要注意以下原則:

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

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

  類似的,也不能夠在SQL語句中含有Group by、connetc by等語句。若有這些語句的話,則數據庫都不允許對數據進行數據更新操作。

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

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

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

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

     在視圖中,可能有些列的結果是通過列表達式定義的,在基礎表中並不存在。我們把這些列叫做虛擬列。只要在視圖中有虛擬列的存在,只要視圖中任何一列是由列表達式定義的,那麼對不起,整張視圖都不能夠進行更改。這個控制原理跟上面這個條件是類似的。

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

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

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

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

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

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

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

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

例如 :

Create Table dept As Select deptno,dname From scott.dept;
Create Table other_dept As select deptno,loc From scott.dept;
Alter Table dept Add Primary Key (deptno);
Alter Table other_dept Add Primary Key(deptno);
然後生成視圖如下:
Create Or Replace View chenj_dept
  As Select a.deptno,b.loc,a.dname From dept a,other_dept b Where a.deptno=b.deptno;
接着對視圖進行DML操作:
Delete From chenj_dept Where deptno=20;
commit;
最後發現dept表中沒有deptno=20的記錄,但是other_dept中卻有

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章