Oracle 概念(Oracle 10.2) 第七章 數(shù)據(jù)字典
7、數(shù)據(jù)字典
這一章描述了每個Oracle數(shù)據(jù)庫核心引用的只讀表,它們的總稱叫數(shù)據(jù)字典(data dictionary)。
這一章包含下列主題:
u 數(shù)據(jù)字典介紹
u 如何使用數(shù)據(jù)字典
u 動態(tài)性能表
u 數(shù)據(jù)庫對象元數(shù)據(jù)
數(shù)據(jù)字典介紹
Oracle數(shù)據(jù)庫的最重要的一個部分就是它的數(shù)據(jù)字典,它們是一些只讀的表集合,提供數(shù)據(jù)庫的信息。一個數(shù)據(jù)字典包含:
l 數(shù)據(jù)庫中所有模式對象的定義(表、視圖、索引、聚集、同義詞、序列、過程、函數(shù)、包、觸發(fā)器等等)
l 模式對象被分配了多少空間,當(dāng)前使用了多少
l 列默認(rèn)值
l 完整性約束信息
l Oracle用戶名
l 每個用戶被賦予的權(quán)限和角色
l 審核信息,例如誰有權(quán)限訪問或者更新不同的模式對象
l 其他數(shù)據(jù)庫通用信息
和其他數(shù)據(jù)庫數(shù)據(jù)一樣,數(shù)據(jù)字典以表和視圖的方式存在。給定數(shù)據(jù)庫的所有數(shù)據(jù)字典表和視圖都保存在數(shù)據(jù)庫的SYSTEM表空間。
數(shù)據(jù)字典不僅僅是Oracle數(shù)據(jù)庫的核心部分,還是從最終用戶到應(yīng)用程序設(shè)計人員和數(shù)據(jù)庫管理員所有用戶的一個重要工具。使用SQL語句可以訪問數(shù)據(jù)字典。因為數(shù)據(jù)字典是只讀的,你只能對它的表或視圖執(zhí)行查詢(SELECT語句)。
數(shù)據(jù)字典結(jié)構(gòu)
數(shù)據(jù)字典包含下列內(nèi)容:
基表
這些底層表保存相關(guān)數(shù)據(jù)庫的信息。只有Oracle可以讀寫這些表。用戶很少直接訪問它們,因為它們是標(biāo)準(zhǔn)化的,而且大部分?jǐn)?shù)據(jù)都以加密的格式保存。
用戶可訪問視圖
這些視圖匯總和顯示保存在數(shù)據(jù)字典基表中的信息。這些表將基表轉(zhuǎn)換為有用的信息,比如用戶或表名、使用連接和WHERE子句來簡化信息。大部分用戶都只被賦予了這些視圖的訪問,而不是直接訪問基表。
SYS,數(shù)據(jù)字典的擁有者
Oracle用戶SYS擁有所有的數(shù)據(jù)字典基表和用戶可訪問表。沒有Oracle用戶能夠更新(UPDATE,DELET,INSERT)SYS模式包含的模式對象或任意行,因為那樣的操作會破壞數(shù)據(jù)完整性。安全管理員必須嚴(yán)格控制這個中心賬號。
注意:修改或者操作數(shù)據(jù)字典表的數(shù)據(jù)能夠?qū)?shù)據(jù)庫操作的影響是持久和有害的。
數(shù)據(jù)字典如何使用
數(shù)據(jù)字典主要有三個用處:
u Oracle訪問數(shù)據(jù)字典來查找關(guān)于用戶、模式對象和存儲結(jié)構(gòu)的信息
u Oracle每次執(zhí)行一個數(shù)據(jù)定義語句(DDL)時都會修改數(shù)據(jù)字典
u 任何Oracle用戶都可以將數(shù)據(jù)字典做為數(shù)據(jù)庫的只讀參考信息
Oracle如何使用數(shù)據(jù)字典
數(shù)據(jù)字典中基表的數(shù)據(jù)對Oracle運行是至關(guān)重要的。因為只有Oracle可以寫入和修改數(shù)據(jù)字典信息。Oracle在數(shù)據(jù)庫升級或者降級時提供腳本來修改數(shù)據(jù)字典表。
注意:數(shù)據(jù)字典表的任何數(shù)據(jù)都不能被任何用戶修改和刪除。
數(shù)據(jù)庫操作過程中,Oracle讀取數(shù)據(jù)字典來確保模式對象存在和用戶有足夠的權(quán)限來訪問它們。Oracle還不斷的更新數(shù)據(jù)字典來反映數(shù)據(jù)庫結(jié)構(gòu)、審核、賦權(quán)和數(shù)據(jù)的變化。
例如,如果用戶Kathy創(chuàng)建一個叫parts的表,然后數(shù)據(jù)字典中會增加新行來反映新的表、列、段、區(qū)段和Kathy在這表上擁有的權(quán)限。這些信息在下次查詢這個字典視圖時可以看到。
數(shù)據(jù)字典視圖的公共同義詞
Oracle對一些數(shù)據(jù)字典視圖創(chuàng)建了公共同義詞,所以用戶可以很方便的訪問他們。安全管理員還可以對模式對象創(chuàng)建公共同義詞,這樣就可以在系統(tǒng)范圍內(nèi)使用。用戶要避免將他們自己的模式對象取名和公共同義詞的名字相同。
針對數(shù)據(jù)字典快速訪問的Cache
大部分的數(shù)據(jù)字典信息都保存在SGA的字典Cache中,因為Oracle運行過程中需要不停的訪問數(shù)據(jù)字典來確認(rèn)用戶有權(quán)限訪問模式對象和確定模式對象的狀態(tài)。保存在的內(nèi)存中的所有信息采用最近使用(LRU)算法。
解析信息也大部分保存在cache中。描述表和行的COMMENT行沒有緩存,除非他們被經(jīng)常訪問。
其他的程序和數(shù)據(jù)字典
其他的Oracle產(chǎn)品可以引用已有的視圖和創(chuàng)建它們自己的數(shù)據(jù)字典表或者視圖。應(yīng)用開發(fā)人員寫的程序指向的數(shù)據(jù)字典應(yīng)該使用公共同義詞而不是底層表:因為在軟件版本之間同義詞基本保持不變。
如何使用數(shù)據(jù)字典
數(shù)據(jù)字典的視圖可以被所有數(shù)據(jù)庫用戶引用。使用SQL語句可以訪問數(shù)據(jù)字典。某些視圖對于所有Oracle用戶可用,其他的只對數(shù)據(jù)庫管理員可用。
數(shù)據(jù)字典在數(shù)據(jù)庫打開時總是可用。它們保存在總是在線的SYSTEM表空間上。
數(shù)據(jù)字典由一系列視圖組成。在多數(shù)情況下,一個由三個視圖組成的系列包含類似的信息,相互之間用他們的前綴區(qū)分:
表7-1 數(shù)據(jù)字典視圖前綴
前綴
范圍
USER
用戶視圖(用戶模式相關(guān)的)
ALL
擴展用戶視圖(用戶可以訪問的)
DBA
數(shù)據(jù)庫管理員的視圖(針對所有用戶模式的)
這一系列視圖的列基本類似,除了:
l USER前綴的視圖通常不包含OWNER列。這一列隱含在對這個USER視圖提交查詢的用戶上。
l 某些DBA視圖包含對管理員有用的一些額外列信息
USER前綴的視圖
典型數(shù)據(jù)庫用戶關(guān)心的視圖就是前綴為USER的視圖。這些視圖:
u 指向用戶自己的私有數(shù)據(jù)庫環(huán)境,包含用戶創(chuàng)建的模式對象信息、用戶創(chuàng)建的權(quán)限等等。
u 只顯示用戶相關(guān)行
u 和其他視圖的列類似,除了不包含隱含的OWNER列之外
u 返回ALL視圖的一部分信息
u 可以有簡單的PUBLIC同義詞來方便使用
例如,下列查詢返回了你的模式中包含的所有對象:
SELECT object_name,object_type FROM USER_OBJECTS;
ALL前綴視圖
ALL前綴視圖指向用戶的數(shù)據(jù)庫整個透視圖。這個視圖除了返回用戶擁有的模式對象信息之外,還返回通過公開的或者隱含的分配給這個用戶的權(quán)限和角色而能夠訪問的模式對象信息。例如,下面的查詢返回你有權(quán)限訪問的所有對象信息:
SELECT owner,object_name,object_type FROM ALL_OBJECTS;
DBA前綴視圖
DBA前綴視圖顯示整個數(shù)據(jù)庫的全景視圖。這些視圖不能創(chuàng)建同義詞,因為DBA前綴視圖只能被數(shù)據(jù)庫管理員訪問。因此,為查詢DBA前綴視圖,管理員必須在視圖名字前加上它的所有者SYS,如下:
SELECT owner,object_name,object_type FROM SYS.DBA_OBJECTS;
Oracle推薦你通過阻止用戶在數(shù)據(jù)字典上擁有系統(tǒng)訪問權(quán)限來保護數(shù)據(jù)字典。如果你啟動了數(shù)據(jù)字典保護(07_DICTIONARY_ACCESSIBILITY為false),然后訪問SYS模式對象(數(shù)據(jù)字典)被限制為擁有SYS模式的用戶。這些用戶是SYS和以SYSDBA方式連接的用戶。(似乎不是這樣子,system也可以訪問,擁有DBA權(quán)限就可以,因為DBA權(quán)限包含了SELECT ANY DICTIONARY權(quán)限)
DUAL表
DUAL表是數(shù)據(jù)字典中的一個小表,Oracle和用戶寫的程序可以引用它來確保一個已知結(jié)果。這個表包含一列叫DUMMY,包含一行值為X。
動態(tài)性能視圖
在Oracle運行期間,Oracle維護了一系列虛擬表來記錄當(dāng)前數(shù)據(jù)庫的活動。這些表叫做動態(tài)性能表。
動態(tài)性能表不是真實的表,它們對于大多數(shù)用戶來說不可訪問。但是,數(shù)據(jù)庫管理員可以查詢、在表上創(chuàng)建視圖、分配這些視圖的權(quán)限給其他用戶。這些視圖有時候叫做固定視圖,因為它們不能由數(shù)據(jù)庫管理員修改和刪除。
SYS擁有動態(tài)性能表;他們的名字以V_$開始。在此基礎(chǔ)上創(chuàng)建視圖,然后再在視圖上創(chuàng)建公共同義詞。這些同義詞以V$開始。例如,V$DATAFILE視圖包含數(shù)據(jù)庫數(shù)據(jù)文件的信息,V$FIXED_TABLE視圖包含數(shù)據(jù)庫中所有動態(tài)性能表和視圖的信息。
數(shù)據(jù)庫對象元數(shù)據(jù)
DBMS_METADATA包提供了抽取全部數(shù)據(jù)庫對象定義的接口。定義可以顯示為XML或者SQL DDL格式。提供兩種形式的接口:
u 可編程控制的靈活精密接口
u 特殊查詢使用的簡單接口