對資料庫檢視view的理解

朱智文發表於2015-11-02

首先解釋什麼是檢視:

檢視其實就是一條查詢sql語句,用於顯示一個或多個表或其他檢視中的相關資料。檢視將一個查詢的結果作為一個表來使用,因此檢視可以被看作是儲存的查詢或一個虛擬表,與真實表不同,檢視不會要求分配儲存空間,檢視中也不會包含實際的資料。檢視只是定義了一個查詢,檢視中的資料是從基表中獲取,這些資料在檢視被引用時動態的生成。由於檢視基於資料庫中的其他物件,因此一個檢視只需要佔用資料字典中儲存其定義的空間,而無需額外的儲存空間,並且基表的變化會導致檢視相應的改變


檢視的建立:

CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view_name [(alias[, alias]...)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY]
其中:
OR REPLACE:若所建立的試圖已經存在,ORACLE自動重建該檢視;
FORCE:不管基表是否存在ORACLE都會自動建立該檢視;
NOFORCE:只有基表都存在ORACLE才會建立該檢視:
alias:為檢視產生的列定義的別名;
subquery:一條完整的SELECT語句,可以在該語句中定義別名;
WITH CHECK OPTION : 插入或修改的資料行必須滿足檢視定義的約束;
WITH READ ONLY : 該檢視上不能進行任何DML操作


在SQL中修改檢視中的資料會受到哪些限制?
------------------------------------
1、必須有許可權 
2、對由多表連線成的檢視修改資料時,不能同時影響一個以上的基表,也不能刪除檢視中的資料 
3、對檢視上的某些列不能修改,這些列是:計算列,內建函式列和行集合函式列 
4、對具有NOT NULL 的列進行修改時可能會出錯。通過檢視修改或者插入資料時,必須保證未顯示的具有NOT NULL 屬性的列有值,可以是預設值,IDENTITY 等,否則不能像檢視中插入資料行。 
5、如果某些列因為規則或者約束的限制不能接受從檢視插入的資料時,則插入資料可能會失敗 
6、刪除基表並不刪除檢視,建議採用與表明顯不同的名字命名規則

檢視的有點:


1.檢視可以隱藏你的查詢的複雜性,例如:

SELECT d.dname,count(*) as NUM_EMPS
 FROM emp e, dept d
 WHERE e.deptno=d.deptno
 GROUP BY dname;

不需要輸入如此複雜的查詢(按照今天的標準來說,那其實並不算是複雜),我可以查詢如下的一個檢視:

SELECT dname,num_emps FROM my_view;      (前提是你建立了基於上面查詢的檢視)

你也能夠將好多相當複雜的查詢儲存為一個檢視,這樣就會將查詢大大的簡化。通過這種方式,檢視就是一種巨集,它可以在幕後做許多事情,並使得這個過程讓終端使用者或者應用程式看起來非常簡單。


2,檢視也可以用於加強安全性。讓我們假設一下,我只想要使用者BOB看到EMP表中的ENAME 和DEPNO兩個列。我可以使用如下所示:
GRANT select ON emp TO bob;

但是上面的命令會使BOB看到表的全部內容。我可以寫下如下的一個檢視,使BOB只看到自己能夠看到的列:

CREATE VIEW bob_emp AS SELECT ename,deptno FROM emp; GRANT select ON bob_emp TO bob;

通過這兩條命令,BOBO只能在檢視中看到這個表中的兩個列。

讓我們更進一步的討論一下安全性的概念。假設我們想要使得每個人都可以查詢EMP表,但是隻是他們自己的記錄。我可以寫出如下的檢視:

CREATE VIEW my_emp AS SELECT * FROM emp WHERE ename=USER; GRANT select ON my_emp TO public;

當一個使用者查詢MY_EMP表示,上述檢視只會返回那些ENAME列值為他們自己的使用者名稱

Oracle檢視非常強大的功能之一在於其可以創 建一個帶有錯誤的檢視。比如說檢視裡的欄位在基表裡不存在,該檢視仍然可以建立成功,但是非法的且無法執行。當基表裡加入了該欄位,或者說某個欄位修改成 檢視裡的該欄位名稱,那麼檢視馬上就可以成為合法的。

3.Oracle檢視非常強大的功能之一在於其可以創 建一個帶有錯誤的檢視

比如說檢視裡的欄位在基表裡不存在,該檢視仍然可以建立成功,但是非法的且無法執行。當基表裡加入了該欄位,或者說某個欄位修改成 檢視裡的該欄位名稱,那麼檢視馬上就可以成為合法的。
檢視的缺點:

4.儲存複雜查詢

一個查詢可能會對錶資料進行復雜的計算。使用者將這個查詢儲存為檢視之後,每次進行類似計算只需查詢此檢視即可。
邏輯資料獨立性

檢視可以使應用程式和資料庫表在一定程度上獨立。如果沒有檢視,應用一定是建立在表上的。有了檢視之後,程式可以建立在檢視之上,從而程式與資料庫表被檢視分割開來。

5.檢視的依賴性

由於檢視的定義是一個引用了其他物件(表,檢視)的查詢,因此檢視依賴於其所引用的物件。Oracle 會自動地處理檢視的依賴性。例如,當使用者移除了一個檢視的基表後再重建此表,Oracle 將檢查新的基表是否符合檢視的定義並判斷檢視的有效性。

相關文章