Oracle 資料庫檢視與基表的關係

不一樣的天空w發表於2017-04-14
一:首先解釋什麼是檢視:檢視其實就是一條查詢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操作。 
三:檢視的修改:直接利用前邊建立時的or replaece  重建即可。
四:檢視上的DML 操作:
1,一般簡單檢視,也就是基表只有一個的檢視,是可以透過修改檢視來修改基表的,
Oracle是可以透過檢視來修改Base table的。所謂base table就是用來構建檢視的表,也就是檢視的資料來源表。但是這種修改是有條件的。比如: 
create view v_emp as select empno,ename,job,deptno from emp where deptno=10 with check option constraint emp_cnst; 
如果有這個限制,那麼透過檢視v_emp 插入資料的deptno欄位的值必須是10,否則就會報“ORA-01402: 檢視 WITH CHECK OPTIDN 違反 where 子句”的異常。
2.針對複雜檢視,也就是基表有多個表,透過內連線查詢建立的檢視,只能透過檢視來修改key_preserved表,
什麼是Key-Preserved Table呢.Oracle給出的定義是:
A table is key preserved if every key of  the table can also be a key of the result of the join.
It is not necessary that the key or keys of a table be selected for it to be key preserved.
It is sufficient that if the key or keys were selected, then they would also be key(s) of the result of the join.

如果某一個表的主鍵可以作為這個join結果(view通常是幾個表的join結果)的主鍵,那麼這個表就是key preserved table.
這個表的主鍵並非一定要出現在select出來的結果集中(select list裡面),但是如果其出現在結果集中,那麼它必須可以滿足作為這個結果集的主鍵的要求.
透過下面的例子來解釋:
create view liuwenhe as select e.ename, e.empno, e.job, d.deptno, d.dname from emp e,dept d where e.empno in (10,30) and e.deptno = d.deptno;   emp表的主鍵是empno,dept表的主鍵是deptno,
可以看出來emp表的主鍵empno的值是唯一的,並且非空,所以是可以做查詢結果集的主鍵的,但是結果集的dempno的值就不一定唯一了。所以這個檢視的key_preserved表是emp,
五;檢視的作用:減少複雜性和增強安全性。
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列值為他們自己的使用者名稱


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


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

相關文章