二. 視圖的作用
2.1 簡單性。
看到的就是需要的。視圖不僅可以簡化用戶對數據的理解,也可以簡化他們的操作。那些被經常使用的查詢可以被定義為視圖,從而使得用戶不必為以後的操作每次指定全部的條件。2.2 安全性。
通過視圖用戶只能查詢和修改他們所能見到的數據。數據庫中的其它數據則既看不見也取不到。數據庫授權命令可以使每個用戶對數據庫的檢索限制到特定的數據庫對象上,但不能授權到數據庫特定行和特定的列上。通過Oracle視圖,用戶可以被限制在數據的不同子集上: 使用權限可被限制在基表的行的子集上。 使用權限可被限制在基表的列的子集上。 使用權限可被限制在基表的行和列的子集上。 使用權限可被限制在多個基表的連接所限定的行上。 使用權限可被限制在基表中的數據的統計匯總上。 使用權限可被限制在另壹視圖的壹個子集上,或是壹些視圖和基表合並後的子集上。 視圖的安全性可以防止未授權用戶查看特定的行或列,是用戶只能看到表中特定行的方法如下: 1 在表中增加壹個標誌用戶名的列; 2 建立Oracle視圖,是用戶只能看到標有自己用戶名的行; 3 把視圖授權給其他用戶。2.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 選項可以不刪除原視圖便可更改其定義並重建,或重新授予對象權限。
四. 視圖操作
視圖分為簡單視圖( 基於單個基表,且不包含函數和數據分組操作 ) 和復雜視圖( 基於多個基表或視圖). 簡單視圖可以通過視圖修改數據. 這些修改包括插入數據. 更新數據和刪除數據. 但是對於復雜視圖來說, 通過視圖修改數據必須滿足壹定的規則.在視圖定義中沒有設定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 權限的用戶可以刪除視圖。刪除視圖的定義不影響基表中的數據。視圖被刪除後,基於被刪除視圖的其他視圖或應用將無效