關於Oracle的視圖

來源:互聯網
上載者:User

一、視圖的定義

視圖(view),也稱虛表, 不佔用物理空間,這個也是相對概念,因為視圖本身的定義語句還是要儲存在資料字典裡的。視圖只有邏輯定義。每次使用的時候, 只是重新執行SQL.

視圖是從一個或多個實際表中獲得的,這些表的資料存放在資料庫中。那些用於產生視圖的表叫做該視圖的基表。一個視圖也可以從另一個視圖中產生。

視圖的定義存在資料庫中,與此定義相關的資料並沒有再存一份於資料庫中。通過視圖看到的資料存放在基表中。

視圖看上去非常象資料庫的物理表,對它的操作同任何其它的表一樣。當通過視圖修改資料時,實際上是在改變基表中的資料;相反地,基表資料的改變也會自動反映在由基表產生的視圖中。由於邏輯上的原因,有些Oracle視圖可以修改對應的基表,有些則不能(僅僅能查詢)。

還有一種視圖:物化視圖(MATERIALIZED VIEW ),也稱實體化視圖,快照 (8i 以前的說法) ,它是含有資料的,佔用儲存空間。

二、視圖的作用

1、簡單性。

看到的就是需要的。視圖不僅可以簡化使用者對資料的理解,也可以簡化他們的操作。那些被經常使用的查詢可以被定義為視圖,從而使得使用者不必為以後的操作每次指定全部的條件。

2、安全性。

通過視圖使用者只能查詢和修改他們所能見到的資料。資料庫中的其它資料則既看不見也取不到。資料庫授權命令可以使每個使用者對資料庫的檢索限制到特定的資料庫物件上,但不能授權到資料庫特定行和特定的列上。通過Oracle視圖,使用者可以被限制在資料的不同子集上:

使用許可權可被限制在基表的行的子集上。

使用許可權可被限制在基表的列的子集上。

使用許可權可被限制在基表的行和列的子集上。

使用許可權可被限制在多個基表的串連所限定的行上。

使用許可權可被限制在基表中的資料的統計匯總上。

使用許可權可被限制在另一視圖的一個子集上,或是一些視圖和基表合并後的子集上。

視圖的安全性可以防止未授權使用者查看特定的行或列,是使用者只能看到表中特定行的方法如下:

(1)在表中增加一個標誌使用者名稱的列;

(2)建立Oracle視圖,是使用者只能看到標有自己使用者名稱的行;

(3)把視圖授權給其他使用者。

3、邏輯資料獨立性。

視圖可協助使用者屏蔽真實表結構變化帶來的影響。

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

(1)如果應用建立在資料庫表上,當資料庫表發生變化時,可以在表上建立視圖,通過視圖屏蔽表的變化,從而應用程式可以不動。

(2)如果應用建立在資料庫表上,當應用發生變化時,可以在表上建立視圖,通過視圖屏蔽應用的變化,從而使資料庫表不動。

(3)如果應用建立在視圖上,當資料庫表發生變化時,可以在表上修改視圖,通過視圖屏蔽表的變化,從而應用程式可以不動。

(4)如果應用建立在視圖上,當應用發生變化時,可以在表上修改視圖,通過視圖屏蔽應用的變化,從而資料庫可以不動。

三、視圖的基本文法:

CREATE[OR REPLACE][FORCE][NOFORCE]VIEW view_name

[(column_name)[,…n]]

AS

Select_statement

[WITH CHECK OPTION[CONSTRAINT constraint_name]]

[WITH READ ONLY]

說明:

view_name :  視圖的名字

column_name: 視圖中的列名

在下列情況下 , 必須指定視圖列的名稱

* 由算術運算式 , 系統內建函數或者常量得到的列

* 共用同一個表名串連得到的列

* 希望視圖中的列名與表中的列名不同的時候

REPLACE:  如果建立視圖時, 已經存在此視圖, 則重新建立此視圖, 相當於覆蓋

FORCE:  強制建立視圖, 無論的視圖所依賴的基表否存在或是否有許可權建立

NOFORCE:  只有基表存在且具有建立視圖許可權時, 才可以建立視圖

WITH CHECK OPTION  指出在視圖上所進行的修改都要符合select_statement 所指定的限制條件

WITH READ ONLY  只允許查看視圖

視圖的定義原則:

(1)視圖的查詢可以使用複雜的 SELECT 文法,包括串連 / 分組查詢和子查詢;

(2)在沒有 WITH CHECK OPTION 和 READ ONLY的情況下,查詢中不能使用ORDER BY子句;

(3)如果沒有為 CHECK OPTION 約束命名,系統會自動為之命名,形式為 SYS_Cn;

(4)OR REPLACE 選項可以不刪除原視圖便可更改其定義並重建,或重新授予對象許可權。

四、視圖操作

視圖分為簡單視圖( 基於單個基表,且不包含函數和資料分組操作 ) 和複雜視圖( 基於多個基表或視圖)。

更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/

簡單視圖可以通過視圖修改資料。 這些修改包括插入資料。 更新資料和刪除資料。 但是對於複雜視圖來說, 通過視圖修改資料必須滿足一定的規則。

在視圖定義中沒有設定READ ONLY 的前提下, 如果視圖包含了下面的內容, 那麼不能通過視圖刪除表中的資料:

* 分組函數, 如SUM,AVG,MIN,MAX 等

*  GROUP BY 子句

* 包含了運算式

* ROWNUM 偽列

插入資料時, 除了滿足上面的條件外, 還需要保證那些沒有包含在視圖定義中的基表的列必須允許空值。 如果在視圖定義中還包含了WITH CHECK OPTION 子句, 那麼對視圖的修改除了前面的那些原則外, 還必須滿足指定的約束條件。 個人認為,視圖利於查詢,不利於修改。

(1)查詢檢視: 可依賴於多個基表。

SELECT  * FROM view_name; /* 類似於查詢表資料*/

(2)更新視圖的前提:

沒有使用串連函數, 集合運算和組函數。 建立視圖的select 語句中沒有集合函數且沒有GROUP BY,ONNECT BY ,START WITH 子句及DISTINCT 關鍵字。 建立視圖的SELECT 語句中不包含從基表列通過計算所得的列。 建立視圖沒有包含唯讀屬性。

(3)插入資料

INSERT  INTO  view_name VALUES();

(4)修改資料:

UPDATE  view_name SET …

若一個視圖依賴於多個基本表, 則一次修改該視圖只能修改一個基本表的資料。

(5)刪除資料:

Delete from view_name where …

同樣, 當視圖依賴多個基表時, 不能使用此語句來刪除基表中的資料。 只能刪除依賴一個基表的資料。

(6)修改視圖定義:

修改視圖的好處在於, 所有相關的許可權都依然存在。 文法同建立視圖相同。

(7)刪除視圖:

DROP VIEW view_name;

只有視圖所有者和具備DROP VIEW 許可權的使用者可以刪除視圖。刪除視圖的定義不影響基表中的資料。視圖被刪除後,基於被刪除視圖的其他視圖或應用將無效。

五、樣本

1、dba_segments 表裡沒有視圖的資訊

SQL> select distinct(segment_type) from dba_segments  group by segment_type;

SEGMENT_TYPE

------------------

LOBINDEX

INDEX PARTITION

NESTED TABLE

TABLE PARTITION

ROLLBACK

LOB PARTITION

LOBSEGMENT

TABLE

INDEX

CLUSTER

TYPE2 UNDO

已選擇11行。

2、對視圖的增刪改操作都是在基表上進行的。

SQL> create table v_dave(id number,name varchar2(20));

表已建立。

SQL> insert into v_dave values(1,'dave');

已建立 1 行。

SQL> commit;

提交完成。

SQL> select * from v_dave;

ID NAME

---------- --------------------

1 dave

SQL> create view view_dave as select * from v_dave;

視圖已建立。

SQL> select * from view_dave;

ID NAME

---------- --------------------

1 dave

上面我們建立了一個表和一個視圖。 下面我們對視圖進行增刪改操作。

(1)對視圖進行insert 操作

SQL> insert into view_dave values(2,'tianlesoftware');

已建立 1 行。

SQL> commit;

提交完成。

SQL> select * from v_dave;

ID NAME

---------- --------------------

1 dave

2 tianlesoftware

SQL> select * from view_dave;

ID NAME

---------- --------------------

1 dave

2 tianlesoftware

最視圖添加的記錄,寫道了對應的基表裡。

(2)對視圖進行delete 操作

SQL> delete from view_dave where id =2;

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

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.