程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> oracle數據字典的字典表、視圖、同義詞關系簡述

oracle數據字典的字典表、視圖、同義詞關系簡述

編輯:Oracle數據庫基礎
我們研究這個問題是從設置字符集開始的,當時發現Oracle服務器端報錯時的提示有時候顯示亂碼(顯示‘?’),而有時候有比較正常。於是在網上發現好幾種查看數據庫字符集的方式             1>select * from v$nls_parameters;              2>select * from nls_database_parameters; 網上都說是查看當前數據庫的字符集(現在看來不准確,原因這裡不談),為什麼查詢後的結果集不一樣呢?尤其是那個地區一個中國,一個美國,還有其他幾個字段不同,這就激起了我研究各種視圖之間聯系的興趣。 相關資料:《深入了解Oracle數據字典》                                             (一)數據庫內置的表和視圖,用戶一般不能改變內容 ==============================================================     orale數據字典裡面字典表和視圖、同義詞有三類         1>s$,--以這種開頭的這是數據字典表         2>v$和gv$--這種開頭的是視圖         3>v_$和gv_$--這種開頭的也是視圖         4>v$和gv$--請注意!!這裡不是視圖,是同義詞,等下解釋這裡為什麼可以和2同             名

    現在來說上面這四種之間的關系,第一種是s$表這些表是內置在數據庫中的,數據庫運行的基礎,隨著數據庫啟動而動態的創建(這是從eygle文檔中得知的)。

    第二種v$/gv$。這種是在x$上創建的視圖,這種視圖不能被授權給任何其他的用戶,如果要親自證明的話, 其一證明是在x$上創建的可以用select view_definition from v$fixed_view_defintion where vIEw_name=upper('這裡寫一個以v$或是gv$開頭的系統內置視圖名稱');    其二證明這種類型的視圖不能被授權給其他用戶,可以用grant select on 視圖名 to 用戶名; 順便說明一下v$和gv$的區別,v$一定是從gv$中通過了實例號的限制條件過濾出來的,因為我們的一個實例一次只能加載一個數據庫,但是一個數據庫可以被多個實例加載,那麼我們為了得到所有實例裡面的信息,就可以使用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$視圖和普通用戶隔離起來了,因為v_$視圖的權限可以授予給用戶,但我不明白的是既然v_$是完全的從v$視圖而來,連字段都一樣,那麼這做的意義何在呢?如果哪位讀者知道懇請指點一下。

    第四種就是同義詞,雖然名稱表面上和第二種一模一樣,舉個例子:
  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
我們仔細觀察就知道一個是同義詞一個是視圖,而且視圖是公有的,而視圖是屬於sys的,自然而然這兩者就不是同一個對象了,例如你試著創建一個a視圖,然後創建一個非公有的同義詞a(名稱相同),就會報錯。但是我又遇到了一個問題,就是同義詞和視圖在dba_objects或是v$fixed_table一個視圖裡面不能一次查出來,而是分別存在連個視圖裡面(我之前做實踐時,印象中曾經這樣做到過,在一個視圖中就同時查出了同義詞和視圖,以後發現了方法再貼出來),不管怎樣現在我們大致明白了2和4的區別。
                                         (二)其他的視圖、表,受用戶影響 =============================================================      以上是關於數據庫字典表或是視圖同義詞的內容,但裡面有個特點就是每個視圖裡面查出來得內容不會隨用戶自己創建表、視圖、同義詞而變化,也就是不建議我們去修改。接下來就談談一些表、視圖,這些對象內容,也就是裡面的記錄受我們用戶的影響。     這裡又大致可以分三類user_*,all_*,dba_*這後面可以接一些具體的信息,比如說tables, users, vIEws, synonyms...              1.查看所有用戶:                 select * from dba_user;                 select * from all_users;                 select * from user_users;              2.查看用戶系統權限:                select * from dba_sys_privs;                select * from all_sys_privs;                select * from user_sys_privs;              3.查看用戶對象權限:                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代表當前用戶權限內可以查看到的信息,all表示在user的權限基礎上加上其他對象的,但是自己可以訪問的信息,而dba的信息就一定包含前面user_*  all_*的所有信息,我猜想Oracle的內部實現是一張實際的基表,然後通過視圖過濾三個級別的三個視圖出來。 三個研究其他表、視圖、同義詞對象入口的視圖:             dba_objects,             v$fixed_table             v$fixed_vIEw_definition  這三個最大的特點就是可以查出對象的類型,所有者之類的信息,並可以查出創建視圖的定義語句(要看表的字段信息desc 表名)                         最後詳細說說dba_objects,v$fixed_table,v$fixed_vIEw_definition ==============================================================
    1>dba_objects可以查看對象的類型,所有者,然後如果你要查看這些對象的詳細信息,就可以根據他的類型了,如果是v$ gv$在v$fixed_view_definition中可以查到(凡是這種開頭的只能這樣查)。否則的話(非v$ gv$)在dba_vIEws裡面可以查到,是同義詞就查dba_synonyms。     2>v$fixed_table,這個表查的也是那些不受用戶而影響的表、視圖信息,我看eygle的推導裡面 這個視圖查詢的總記錄數=x$開頭的記錄數 + v$開頭的記錄數 +  gv$開頭的記錄數;在Oracle 10 R2中發生了改變,新增了個:GO$SQL_BIND_CAPTURE     和 O$SQL_BIND_CAPTURE      3>v$fixed_vIEw_definition在1>裡面已經說了,只能查v$ gv$開頭的視圖的信息

最後有的讀者可能會想,我自己創建v$或是x$這種與數據字典表相似風格的表或其他類型的對象,當然沒關系,絲毫不會影響到那些數據字典表,這些表的信息只會影響到dba_*這些對象的信息(記錄增加),但是不建議這麼做,容易混淆。

還有我有一個問題沒有解決:當我查看dba_objects,dba_vIEws,dba_synonyms這些視圖的定義信息時,顯示不完全,其中顯示的一部分告訴我它依賴的表
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$這種類型的表

總結:通過研究數據字典,對oracle的認識更深了,但感覺自己的理解還是不很深刻,剛開始學Oracle應該都是這樣的吧,一次寫這麼多,寫得不好的地方見諒,請指出我的錯誤(這點很重要,這是進步的捷徑)我會繼續努力的,跟大家分享更多的自己的觀點。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved