user代表當(dāng)前用戶權(quán)限內(nèi)可以查看到的信息,all表示在user的權(quán)限基礎(chǔ)上加上其他對象的,但是自己可以訪問的信息,而dba的信息就一定包含前面user_* all_*的所有信息,我猜想oracle的內(nèi)部實(shí)現(xiàn)是一張實(shí)際的基表,然后通過視圖過濾三個級別的三個視圖出來。
oracle數(shù)據(jù)字典的字典表、視圖、同義詞關(guān)系簡述 1>select * from v$nls_parameters;
2>select * from nls_database_parameters;
網(wǎng)上都說是查看當(dāng)前數(shù)據(jù)庫的字符集(現(xiàn)在看來不準(zhǔn)確,原因這里不談),為什么查詢后的結(jié)果集不一樣呢?尤其是那個地區(qū)一個中國,一個美國,還有其他幾個字段不同,這就激起了我研究各種視圖之間聯(lián)系的興趣。
相關(guān)資料:《深入了解Oracle數(shù)據(jù)字典》
(一)數(shù)據(jù)庫內(nèi)置的表和視圖,用戶一般不能改變內(nèi)容
==============================================================
orale數(shù)據(jù)字典里面字典表和視圖、同義詞有三類
1>s$,--以這種開頭的這是數(shù)據(jù)字典表
2>v$和gv$--這種開頭的是視圖
3>v_$和gv_$--這種開頭的也是視圖
4>v$和gv$--請注意??!這里不是視圖,是同義詞,等下解釋這里為什么可以和2同 名
現(xiàn)在來說上面這四種之間的關(guān)系,第一種是s$表這些表是內(nèi)置在數(shù)據(jù)庫中的,數(shù)據(jù)庫運(yùn)行的基礎(chǔ),隨著數(shù)據(jù)庫啟動而動態(tài)的創(chuàng)建(這是從eygle文檔中得知的)。
第二種v$/gv$。這種是在x$上創(chuàng)建的視圖,這種視圖不能被授權(quán)給任何其他的用戶,如果要親自證明的話,
其一證明是在x$上創(chuàng)建的可以用select view_definition from v$fixed_view_defintion where view_name=upper('這里寫一個以v$或是gv$開頭的系統(tǒng)內(nèi)置視圖名稱');
其二證明這種類型的視圖不能被授權(quán)給其他用戶,可以用grant select on 視圖名 to 用戶名;
順便說明一下v$和gv$的區(qū)別,v$一定是從gv$中通過了實(shí)例號的限制條件過濾出來的,因?yàn)槲覀兊囊粋€實(shí)例一次只能加載一個數(shù)據(jù)庫,但是一個數(shù)據(jù)庫可以被多個實(shí)例加載,那么我們?yōu)榱说玫剿袑?shí)例里面的信息,就可以使用gv$這種視圖了。
第三種就是v_s$或是gv_s$了,oracle安裝目錄里面有個文件catalog.sql 這樣一些腳本:
create or replace view v_$fixed_table as select * from v$fixed_table;
create or replace public synonym v$fixed_table for v_s$fixed_table;
從這里我們可以看出,第三種就是一個完完全全的第二種的一個copy一樣,但是eygle說通過v_s$視圖把v$視圖和普通用戶隔離起來了,因?yàn)関_$視圖的權(quán)限可以授予給用戶,但我不明白的是既然v_$是完全的從v$視圖而來,連字段都一樣,那么這做的意義何在呢?如果哪位讀者知道懇請指點(diǎn)一下。
第四種就是同義詞,雖然名稱表面上和第二種一模一樣,舉個例子:
1 select name, type from v$fixed_table
2* where name=upper('v$sga')
SQL> /
NAME TYPE
------------------------------ -----
V$SGA VIEW
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
SQL> col object_name for a25;
SQL> col object_type for a25;
SQL> col owner for a25;
SQL> select object_name, object_type, owner
2 from dba_objects
3 where object_name=upper('v$sga');
OBJECT_NAME OBJECT_TYPE OWNER
------------------------- ------------------------- -------------------------
V$SGA SYNONYM PUBLIC
我們仔細(xì)觀察就知道一個是同義詞一個是視圖,而且視圖是公有的,而視圖是屬于sys的,自然而然這兩者就不是同一個對象了,例如你試著創(chuàng)建一個a視圖,然后創(chuàng)建一個非公有的同義詞a(名稱相同),就會報(bào)錯。但是我又遇到了一個問題,就是同義詞和視圖在dba_objects或是v$fixed_table一個視圖里面不能一次查出來,而是分別存在連個視圖里面(我之前做實(shí)踐時(shí),印象中曾經(jīng)這樣做到過,在一個視圖中就同時(shí)查出了同義詞和視圖,以后發(fā)現(xiàn)了方法再貼出來),不管怎樣現(xiàn)在我們大致明白了2和4的區(qū)別。
(二)其他的視圖、表,受用戶影響
=============================================================
以上是關(guān)于數(shù)據(jù)庫字典表或是視圖同義詞的內(nèi)容,但里面有個特點(diǎn)就是每個視圖里面查出來得內(nèi)容不會隨用戶自己創(chuàng)建表、視圖、同義詞而變化,也就是不建議我們?nèi)バ薷?。接下來就談?wù)勔恍┍?、視圖,這些對象內(nèi)容,也就是里面的記錄受我們用戶的影響。
這里又大致可以分三類user_*,all_*,dba_*這后面可以接一些具體的信息,比如說tables, users, views, synonyms...
1.查看所有用戶:
select * from dba_user;
select * from all_users;
select * from user_users;
2.查看用戶系統(tǒng)權(quán)限:
select * from dba_sys_privs;
select * from all_sys_privs;
select * from user_sys_privs;
3.查看用戶對象權(quán)限:
select * from dba_tab_privs;
select * from all_tab_privs;
select * from user_tab_privs;
4.查看所有角色:
select * from dba_roles;
5.查看用戶所擁有的角色:
select * from dba_role_privs;
select * from user_role_privs;
user代表當(dāng)前用戶權(quán)限內(nèi)可以查看到的信息,all表示在user的權(quán)限基礎(chǔ)上加上其他對象的,但是自己可以訪問的信息,而dba的信息就一定包含前面user_* all_*的所有信息,我猜想oracle的內(nèi)部實(shí)現(xiàn)是一張實(shí)際的基表,然后通過視圖過濾三個級別的三個視圖出來。 三個研究其他表、視圖、同義詞對象入口的視圖:
dba_objects,
v$fixed_table
v$fixed_view_definition
這三個最大的特點(diǎn)就是可以查出對象的類型,所有者之類的信息,并可以查出創(chuàng)建視圖的定義語句(要看表的字段信息desc 表名)
最后詳細(xì)說說dba_objects,v$fixed_table,v$fixed_view_definition
==============================================================
1>dba_objects可以查看對象的類型,所有者,然后如果你要查看這些對象的詳細(xì)信息,就可以根據(jù)他的類型了,如果是v$ gv$在v$fixed_view_definition中可以查到(凡是這種開頭的只能這樣查)。否則的話(非v$ gv$)在dba_views里面可以查到,是同義詞就查dba_synonyms。
2>v$fixed_table,這個表查的也是那些不受用戶而影響的表、視圖信息,我看eygle的推導(dǎo)里面 這個視圖查詢的總記錄數(shù)=x$開頭的記錄數(shù) + v$開頭的記錄數(shù) + gv$開頭的記錄數(shù);在oracle 10 R2中發(fā)生了改變,新增了個:GO$SQL_BIND_CAPTURE 和 O$SQL_BIND_CAPTURE
3>v$fixed_view_definition在1>里面已經(jīng)說了,只能查v$ gv$開頭的視圖的信息
最后有的讀者可能會想,我自己創(chuàng)建v$或是x$這種與數(shù)據(jù)字典表相似風(fēng)格的表或其他類型的對象,當(dāng)然沒關(guān)系,絲毫不會影響到那些數(shù)據(jù)字典表,這些表的信息只會影響到dba_*這些對象的信息(記錄增加),但是不建議這么做,容易混淆。
還有我有一個問題沒有解決:當(dāng)我查看dba_objects,dba_views,dba_synonyms這些視圖的定義信息時(shí),顯示不完全,其中顯示的一部分告訴我它依賴的表
SQL> select text from dba_views
2 where view_name=upper('dba_synonyms');
TEXT
--------------------------------------------------------------------------------
select u.name, o.name, s.owner, s.name, s.node
from sys.user$ u, sys.syn$ s, sys
sys.ysn$ 和sys.user$這種類型的表
總結(jié):通過研究數(shù)據(jù)字典,對oracle的認(rèn)識更深了,但感覺自己的理解還是不很深刻,剛開始學(xué)oracle應(yīng)該都是這樣的吧,一次寫這么多,寫得不好的地方見諒,請指出我的錯誤(這點(diǎn)很重要,這是進(jìn)步的捷徑)我會繼續(xù)努力的,跟大家分享更多的自己的觀點(diǎn)。
|
|