《Oracle数据库管理与维护实战》——2.11 Oracle数据字典
本節書摘來自異步社區出版社《Oracle數據庫管理與維護實戰》一書中的第2章,第2.11節,作者: 何偉娜 , 常建功,更多章節內容可以訪問云棲社區“異步社區”公眾號查看。
2.11 Oracle數據字典
Oracle數據庫管理與維護實戰
數據字典內存放了Oracle的數據庫信息,用戶可以通過數據字典來查看這些信息。數據字典是只讀的,它是Oracle數據庫的最重要的部分之一,是由一組只讀的表及其視圖組成。數據字典可提供以下的信息。
Oracle用戶的名字
每一個用戶所擁有的權限和角色
數據庫對象的名字(表、視圖、快照、索引、聚集、同義詞、序列、過程、函數、包及觸發器等)
關于完整性約束的信息
列的缺省值
有關數據庫中對象的空間分布及當前使用情況
審計信息(如誰存取或修改各種對象)
其它的一些數據庫信息
Oracle中的數據字典有靜態和動態之分。靜態數據字典主要包含用戶在訪問數據字典時不會發生改變的信息。而動態數據字典是依賴數據庫運行的性能的,反映數據庫運行的一些內在信息,所以在訪問這類數據字典時數據往往不是一成不變的,數據庫管理員常從動態數據字典中獲得數據的運行信息。接下來我們分別就這兩類數據字典來論述。
2.11.1 靜態數據字典
這類數據字典主要是由表和視圖組成。應該注意的是,數據字典中的表是不能直接來訪問的,但是可以訪問數據字典中的視圖。靜態數據字典中的視圖分為三類,它們分別為:USER、ALL、DBA_。
USER_視圖存儲了當前用戶所擁有的對象的信息(即所有在當前用戶模式下的對象)。
ALL_視圖存儲了當前用戶能夠訪問的所有對象的信息。與USER相比,ALL并不需要擁有該對象,只需要有訪問該對象的權限即可。
DBA_視圖存儲了數據庫中所有對象的信息。當前用戶必須具有訪問這些數據庫的權限才能訪問,一般來說必須具有管理員權限。
三類視圖之間的數據有重疊,它們之間除了因為訪問權限不一樣所以訪問范圍不一樣之外,其他均具有一致性。具體來說,由于數據字典視圖是由SYS(系統用戶)所擁有的,在缺省情況下,只有SYS和擁有DBA系統權限的用戶可以看到所有的視圖。沒有DBA權限的用戶只能看到USER_和ALL_視圖。如果用戶沒有被授予相關的SELECT權限,就不能看到DBA_視圖的內容。舉例來說,USER_USERS、ALL_USERS、DBA_USERS視圖內放的都是有關用戶的信息,USER_USERS內放的是用戶名,用戶狀態,用戶創建時間等信息,而ALL_USERS內放的是當前數據庫內所有用戶的用戶名稱和用戶創建時間。DBA_USERS內描述的字段信息和USER_USERS一樣,但顯示所有用戶的信息。三者一般同時出現,有USER_USERS就有DBA_USERS和ALL_USERS;同樣,有USER_TABLES就有DBA_TABLES和ALL_TABLES等,只是范圍不一樣。
下面我們以USER_為例介紹幾個常用的靜態視圖。
1.USER_USERS視圖
該視圖顯示當前用戶的信息,主要包括當前用戶名、賬戶id、賬戶狀態、表空間名、創建時間等。
2.USER_TABLES視圖
該視圖顯示當前用戶擁有所有表的信息,主要包括表名、表空間名、簇名等。通過此視圖用戶可以清楚了解當前用戶可以操作的表。
3.USER_OBJECTS視圖
該視圖顯示當前用戶擁有的所有對象的信息,對象包括表、視圖、存儲過程、觸發器、包、索引、序列等。該視圖比USER_TABLES視圖更加全面。例如,如需要獲取一個名為“package1”的對象類型和其狀態的信息,執行以下命令。
這里upper(一個PL/SQL內置函數)函數用來轉換大小寫,數據字典里的所有對象均為大寫形式,而PL/SQL里不區分大小寫,在實際操作中一定要注意大小寫匹配。
4.USER_TAB_PRIVS視圖
該視圖顯示當前用戶對所有表的權限信息。
例如,為了了解當前用戶對table1的權限信息,執行以下命令。
SQL>select * from user_tab_privs
where table_name=upper('table1')
了解了當前用戶對該表的權限之后用戶就可以清楚地知道,哪些操作可以執行,哪些操作不能執行。
2.11.2 查看各類靜態對象
查看各類靜態對象內容對分析Oracle的內部運行機制有十分重要的作用,有時開發人員也需要如何查看各類靜態對象。下面我們將給出查看一些最常用對象的方法。
1.查看用戶信息
查看當前用戶的缺省表空間的代碼如下。
查看當前用戶的角色的代碼如下。
SQL>select * from user_role_privs;查看當前用戶的系統權限和表級權限如下。
SQL>select * from user_sys_privs; SQL>select * from user_tab_privs;2.表
查看用戶下所有的表的代碼如下。
查看名稱包含log字符的表的代碼如下。
SQL>select object_name,object_id from user_objects where instr(object_name,'LOG')>0;查看某表的創建時間的代碼如下。
SQL>select object_name,created from user_objects where object_name=upper('&table_name');查看某表的大小的代碼如下。
SQL>select sum(bytes)/(1024*1024) as "size(M)" from user_segments where segment_name=upper('&table_name');查看放在Oracle的內存區里的表的代碼如下。
SQL>select table_name,cache from user_tables where instr(cache,'Y')>0;3.索引
查看索引個數和類別的代碼如下。
查看索引被索引的字段的代碼如下。
SQL>select * from user_ind_columnswhere index_name=upper('&index_name');查看索引的大小的代碼如下。
SQL>select sum(bytes)/(1024*1024) as "size(M)" from user_segments where segment_name=upper('&index_name');4.序列號
查看序列號,last_number是當前值的代碼如下。
5.視圖
查看視圖的名稱的代碼如下。
查看創建視圖的select語句如下。
SQL>set view_name,text_length from user_views; SQL>set long 2000; %說明:可以根據視圖的text_length的值設定set long的大小 SQL>select text from user_views where view_name=upper('&view_name');6.同義詞
查看同義詞的名稱的代碼如下。
7.約束條件
查看某表的約束條件的代碼如下。
8.存儲函數和過程
查看函數和過程的狀態的代碼如下。
查看函數和過程的源代碼如下。
SQL>select text from all_source where owner=user and name=upper('&plsql_name');2.11.3 動態數據字典
Oracle包含了一些潛在的由系統管理員如SYS維護的表和視圖,因為數據庫運行時它們會不斷進行更新,所以稱為動態數據字典(或者是動態性能視圖)。這些視圖提供了關于內存和磁盤的運行情況,所以只能對其進行只讀訪問而不能修改。
Oracle中這些動態性能視圖都是以v$開頭的視圖,比如v$access。下面我們就幾個主要的動態性能視圖進行介紹。
1.V$ACCESS視圖
視圖內描述了數據庫中鎖定的數據庫對象以及訪問這些對象的會話對象(session對象)。
2.V$SESSION視圖
視圖內描述了當前會話的詳細信息。該視圖字段較多。
3.V$ACTIVE_INSTANCE視圖
視圖內描述了當前數據庫下活動實例的信息。
4.V$CONTEXT視圖
視圖內描述了當前會話的屬性信息,比如命名空間、屬性值等。
2.11.4 各類數據字典區分
Oracle中有多種數據字典,有ALL,USER,DBA,V$,GV$,V$,GV_$,X$。數據字典之間的關系比較復雜,前四種前面我們已介紹過,下面詳細介紹后幾種。
GV$視圖是從Oracle 8開始引入的,G表示Global。除了一些特例以外,每個V$視圖都有一個對應的GV$視圖存在,如GV$FIXED_TABLE對應V$FIXED_TABLE視圖。GV$視圖出現在并行服務器(OPS)環境中。在并行服務器環境中,GV$視圖返回的是所有實例信息;而V$視圖則是在GV$視圖的基礎上,增加了實例ID判斷后的結果,即每個V$視圖都是在GV$視圖中包含語句where inst_id = USERENV('Instance')而產生的,如圖2-35所示。
V$、GV$實際上又是GV$,V$視圖的同義詞(圖2-35中以‘=’號表示),V$,GV$是用下面SQL語句從GV$,V$視圖中創建的。
SQL>create or replace view v_$nls_parameters as select * from v$nls_parameters; SQL>create or replace public synonym v$nls_parameters for v_$nls_parameters; SQL>grant select on v_$nls_parameters to public;事實上,V$視圖是真正的視圖,V$視圖是基于X$表直接建立的。
X$表是Oracle數據庫的運行基礎,在數據庫啟動時由Oracle應用程序動態創建。
2.11.5 動態數據字典結構
以后用戶經常會用到動態數據字典,尤其是數據管理員。動態數據字典是管理員獲取數據庫信息的一個接口。圖2-36、圖2-37和圖2-38給出動態數據字典的結構和分類,以幫助讀者加深理解。
2.11.6 動態數據字典分類
Oracle數據庫中保存了許多動態數據字典,為了便于用戶掌握,這里專門對這些數據字典進行分類,表2-9給出一個數據字典分類表。
說明:“支持的數據庫版本”列如果沒有寫出支持的版本,表示任何版本都支持。
總結
以上是生活随笔為你收集整理的《Oracle数据库管理与维护实战》——2.11 Oracle数据字典的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《HTML5 canvas开发详解(第2
- 下一篇: Ubuntu Linux中使用快捷键截图