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

來源:互聯網
上載者:User

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

一:首先解釋什麼是視圖:視圖其實就是一條查詢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視圖非常強大的功能之一在於其可以創 建一個帶有錯誤的視圖。比如說視圖裡的欄位在基表裡不存在,該視圖仍然可以建立成功,但是非法的且無法執行。當基表裡加入了該欄位,或者說某個欄位修改成 視圖裡的該欄位名稱,那麼視圖馬上就可以成為合法的。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.