Oracle視圖管理
?
??? 很久沒有繼續學習DBA的內容了,因為這中間實在是忙得焦頭爛額啊。最近雖然還是很忙,但是想是想把這一塊盡早結束掉。所以打算先把別的放一放,抓緊時間學習一下這部分內容。今天的內容比較簡單,是關于View的管理,這是最常用的操作,記錄一下,僅為完整性。
?
?
一、視圖的創建規則
?
??? 這里需要注意的一點就是:初始創建用戶如果只是賦予了resource權限的話,那只能默認可以創建table、function、procedure、package等等,但是不包括創建view的權限,如果需要創建view權限,需要專門賦權“CREATE VIEW”或者“CREATE ANY VIEW”權限。
?
??? 另外需要說明的一點是:視圖的操作權限取決于創建視圖的user對視圖中涉及的table的操作權限大小。例如用戶A創建的關于TABLE_A的視圖VIEW_A,而A對于TABLE_A有select、insert的權限,則如果將這個VIEW_A的select、insert權限賦予用戶B,那么用戶B也將可以對VIEW_A進行select和insert,而無須擁有與TABLE_A操作的權限。同樣,即便B擁有了對VIEW_A所有的操作權限,也不能對VIEW_A進行update等操作。
?
1、創建一個簡單的view
?
create view sales_staff as
select empno, ename, deptno
? from emp
where deptno = 10
with check option constraint sales_staff_cnst; --此句用于創建帶有約束的view
?
注意一點:既然是對deptno=10的視圖,不能對任何view無法查詢到的記錄進行修改。
例如insert into sales_staff values(7654, 'AAA', 30); 是會報錯的。
?
2、Oracle后臺的*展開
?
??? Oracle在創建view時,會將頂層視圖查詢中的所有通配符(*)展開成列,形成的查詢被存儲在數據字典中。而且會存儲相應字段名的完整大些名稱,如下例所示:
?
create view dept as select * from scott.dept;
-->
create "DEPTNO", "DNAME", "LOC" FROM scott.dept;
?
3、帶錯誤創建view
?
??? 如果要先創建view,后創建table(這種情況還是有實際意義的),那么就需要是喲個“帶錯誤創建視圖”的功能。這樣,當創建視圖時,涉及到不存在的表或現存表中的無效的列,或者當視圖的擁有者不具備所需的權限時,還是能創建視圖并輸入到數據字典。當然這種視圖是不能使用的。
?
??? 創建的語法是:
?
??? CREATE FORCE VIEW AS ...
?
?
二、視圖數據的更改
?
??? 關于視圖是否可更改,影響的條件有很多,具體的可以參看我以前的文章《關于Views的Updatable問題》,里面有詳細的論述。但是Oracle是很人性化的軟件,所以我們不需要記那么復雜的東西,我們要查看某個View時候可以更新,只需要查詢USER_UPDATABLE_COLUMNS這個數據字典就可以搞定了。
?
??? 舉個簡單的例子:
?
SQL>
create table test_a (a int,b int);
?
Table created.
SQL>
create view test_view as select a,sum(b) b from test_a group by a;
?
View created.
SQL> select * from user_updatable_columns where lower(table_name)='test_view';
?
OWNER??????? TABLE_NAME?? COLUMN UPDATA INSERT DELETA
------------ ------------ ------ ------ ------ ------
WANGXIAOQI?? TEST_VIEW??? B????? NO???? NO???? NO
WANGXIAOQI?? TEST_VIEW??? A????? NO???? NO???? NO
??? 可見,包含有匯總函數的view是無法做任何的更改的。
?
?
三、視圖的其他操作
?
??? 視圖的其他操作也的都比較簡單,所以都放在一起了解一下
?
1、更改視圖
?
??? alter view語句只有一個功能,就是用來重新編譯視圖,即:
??? alter view view_name compile;
?
2、刪除視圖
?
??? 啥也不說了
??? drop view view_name;
?
3、替換視圖
?
??? 因為view不涉及任何的實際數據存儲,所以可以直接drop后重建。當然最合適的做法是
使用create or replace view來替換原有的view。
?
??? 需要注意的有:
??? ● 替換之后也更新了數據字典中的視圖定義
??? ● 所有依賴于此view的PLSQL、View會全部失效
?
?
四、關于視圖的查看
?
??? DBA|ALL|USER_VIEWS:查看所有視圖的定義
??? DBA|ALL|USER_UPDATABLE_COLUMNS:查看所有字段是否可更新
???
??? 如果需要查看VIEW創建時的代碼,兩種方法:
?
??? 1、select text from user_views where view_name = 'VIEW_NAME';
?
??? 2、select dbms_metadata.get_ddl('VIEW','VIEW_NAME') from dual;
?
?
?
?
?
?
?