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