7 資料字典
這章講了每個oracle資料庫上唯讀的表和檢視的重要集合,為大家所知的資料字典。
這章包含下面的內容:
*資料字典的引入
*資料字典是如何被利用的?
*動態的效能表
*資料庫物件元資料
資料字典的引入
乙個資料庫最重要的部分之一是資料字典,資料字典是那些唯讀的提供關於資料庫資訊的表的集合。乙個資料字典包含:
*在資料庫中所有物件的定義(表,檢視,索引,簇,同義詞,序列,儲存過程,函式,包,觸發器等等);
*有多少空間已經被分配給物件並且被物件所利用;
*每列的預設值;
*完整性約束資訊
*oracle使用者的名字
*每個使用者被授予的權利以及角色
*審核資訊,例如各種物件已經被誰訪問過或者更新過;
*其他的一般的資料庫資訊;
資料字典是以表和檢視的形式被構造,就像其他的資料庫資料。對於乙個給定的資料庫所有資料字典中的表和檢視被儲存在資料庫的system表空間裡。
資料字典不僅是對於每個資料庫來說是重要的,對所有使用者,從應用軟體的終端使用者到應用軟體的設計者和資料庫管理員來說也是非常重要的。一般是通過sql語句來訪問資料字典。因為資料字典是唯讀的,所以你只能通過對資料字典的表和檢視發出查詢操作(select語句)。
資料字典的結構
資料字典是由下面的組成的:
基表基表是儲存關於相關資料庫的資訊的潛在的表。只有oracle能夠向這些表中寫或者讀。使用者幾乎很少直接訪問這些表因為這些表被格式化,並且大多數資料是以秘密的形式儲存的。
使用者可訪問的檢視
使用者可訪問的檢視總結並且顯示了資料字典中的儲存在基表中的資訊的檢視。這些檢視將基表中的資料解碼成為有用的資訊,例如:使用者或者表名,採用連表或者where條件篩選。大多數被授予訪問檢視的許可權而不是訪問基表的許可權。
資料字典的擁有者—sys
oracle的sys使用者擁有資料字典的基表和使用者可訪問的檢視。oracle的其他使用者是永遠不能修改在sys使用者下的物件或者是更新,刪除或者插入資料行操作的,因為這樣的行為可能會破壞資料完整性。安全管理員必須嚴格控制這個重要的資料。
警告:對資料字典表中資料的修改或者操作可能會永久的並且嚴重的影響資料庫操作。
資料字典是如何被利用的
資料字典有三個主要的用途:
*oracle通過訪問資料字典來查詢關於使用者,物件以及儲存結構的資訊;
*每次ddl語句被執行,oracle會修改資料字典的資訊;
*任何oracle使用者都可以利用資料字典得到關於資料庫的唯讀的參考資訊。
oracle是如何利用資料字典的
資料字典中基表的資料對於oracle執行是必要的資訊。因此,只有oracle能夠對資料字典的資訊進行寫操作或者修改操作。每當資料庫公升級或者降級時,oracle提供指令碼來修改資料字典中的表。
警告:在資料字典中表的資料不應該被任何使用者修改或者刪除。
在資料庫執行期間,oracle讀取資料字典資訊來確保物件的存在並且使用者有適當的許可權訪問這些物件。oracle也不停地更新資料字典來反映資料庫結構的變化,審核,許可權授予以及資料方面的變化。
例如:如果使用者kathy建立一張名為parts的表,然後新的記錄被加入到資料字典中,這條新的記錄包含了新錶的資訊,以及表列,表段,表區域以及使用者kathy擁有的對該錶的許可權的資訊。這些新的資訊在下次資料字典被查詢時是可見的。
資料字典檢視的公共的同義詞
oracle建立了許多資料字典中檢視的公共的同義詞以便使用者能夠方便的訪問它們。安全管理員也可以為那些被應用的比較廣泛的物件建立額外的公共的同義詞。使用者應該避免為給自己使用者下的物件命名乙個與公共的同義詞的名字一樣的名字。
為快速訪問快取資料字典
資料字典的大多數資訊被保留在字典快取中的sga(系統全域性區域)中,因為在資料庫做驗證使用者的訪問許可權並且檢驗物件的狀態的操作時,oracle不停地訪問資料字典。所有的資訊採用最近最少(lru)的演算法來在記憶體中儲存。
分解的資訊被保留在記憶體中。描述表以及列的注釋的資訊一般是不被存放在記憶體中除非它們被頻繁的訪問。
其他程式和資料字典
其他的oracle產品能夠引用存在的檢視並且建立額外的屬於他們自己的資料字典表和檢視。應用軟體開發者寫的程式中引用資料字典應該引用公共的同義詞而不是引用潛在表:同義詞在軟體發布之間很少可能被修改。
如何利用資料字典
對於所有資料庫使用者來說資料字典的檢視是提供乙個參考。用sql語句來訪問資料字典檢視。一些檢視所有oracle使用者都是可以訪問的,並且其他的檢視只能是資料庫管理員可以訪問。
資料字典是由檢視的集合組成。在許多例子中,三個包含類似資訊檢視的集合,並且通過它們的字首來與其他的檢視相互區別:
表7-1 資料字典檢視字首
字首
範圍
user
使用者的檢視(在該使用者下的檢視)
all
擴充套件的使用者檢視(指定的使用者可以訪問的檢視)
dba
資料庫管理員檢視(在所有使用者下的檢視)
所有檢視的列的集合上相同的,但是有下面的異常:
*在字首是user的檢視通常不包含owner列。在user字首的檢視這列可以通過該使用者發布的查詢命令來暗含是該使用者的資訊;
*一些dba的檢視有額外的列包含了一些對資料庫管理員有用的資訊。
帶有使用者字首的檢視
最可能對典型的資料庫使用者感興趣的檢視是那些帶有user字首的檢視。這些檢視:
*涉及到在資料庫中該使用者自己私有的環境,包括被該使用者建立的物件,被該使用者授予的許可權等等資訊;
*只顯示與該使用者相關的行;
*除了已經被暗示的owner列之外,和其他的檢視具有相同的列;
*返回在帶有all字首的檢視的子集;
*為了方便可以擁有簡短的pulic同義詞;
例如:下面的查詢返回在你使用者下包含的所有物件:
select object_name, object_type from user_objects; 帶有
all字首的檢視 帶有
all字首的檢視反映資料庫使用者的所有觀察圖。這些檢視不僅反映那個使用者自身擁有的物件,也返回了有關一些物件的資訊,這些物件都已經通過公共的或者已經明確的將一些許可權和角色授予該使用者並且是使用者可以訪問的物件。例如:下面的查詢返回一些你能夠訪問的所有物件的資訊:
select owner, object_name, object_type from all_objects; 帶有
dba字首的檢視 帶有
dba字首的檢視顯示了整個資料庫的乙個全域性的檢視。對於這些檢視同義詞是不允許被建立的,因為
dba檢視只應該被管理員所查詢。因此,為了查詢
dba檢視,管理員必須在這個檢視名字的前面加上擁有者
,sys
,像下面的語句:
select owner, object_name, object_type from sys.dba_objects;
oracle
推薦你執行資料字典保護來阻止使用者通過利用在資料字典上的這樣的許可權擁有了任何系統許可權。如果你使用資料字典保護(o7_dictionary_accessibility
是false
),然後對sys使用者下的物件的訪問只限制於sys使用者下。這些使用者是sys並且是以sysdba身份連線資料庫的。
dual表
名字為dual的表是一張在資料字典中的表表,oracle和使用者寫的程式可以引用這張表來保證乙個大家都知道的結果。這戰敗表有乙個名為dummy的列並且有一行資料並且資料值是『x』。
動態的效能表
在資料庫執行的整個過程中,oracle維護一組記錄當前資料庫的活動的虛擬表。這些表被稱為動態的效能表。
動態的效能表不是真正的表,並且它們不能被大多數使用者所訪問。但是,資料庫管理員能夠查詢這些表並且可以在這些表上建立檢視,而且可以將這些新建立的檢視的訪問許可權授予其他使用者。這些檢視有時候也被稱之為固定的試圖,因為它們不能夠被資料庫管理員修改和移動。
sys使用者擁有動態的效能表;它們的名字都是以v_$開頭的。可以在這些表上建立檢視,並且也可以對這些已經建好的檢視建立同義詞。這些同義詞的名字都是以v$開頭的。例如:v$datafile檢視包含了關於資料庫檔案的資訊,並且v$fixed_table檢視包含了關於在資料庫中所有的動態效能表和檢視的資訊。
資料庫物件的元資料
dbms_metadata包提供了提取資料庫物件複雜定義的介面。這些定義可以通過或者xml形式或者sql的ddl的形式來表達。兩種風格的介面被提供:
*用來有計畫的控制的乙個靈活的複雜的介面;
*用來ad hoc查詢的簡單化的介面。
第7章 函式 7
7.7 類的成員函式 函式原型必須在類中定義。但是,函式體則既可以在類中也可以在類外定義。7.7.1 定義成員函式的函式體 類的所有成員都必須在類定義的花括號裡面宣告,此後,就不能再為類增加任何成員。類的成員函式必須加宣告的一般定義。類的成員函式既可以在類的定義內也可以在類的定義外定義。編譯器隱式地...
第7章 排序
第7章 排序 任何通用的排序演算法均需要nlogn次比較 7.1 預備知識 略7.2 插入排序 插入排序思想 在已排序狀態插入新元素 插入排序的最壞情形和平均情形均為n的平方 7.3 一些簡單排序演算法的下界 通過比較和交換來進行排序的演算法本質上是消除序列中的逆序數,因此求解該演算法的時間複雜度時...
第7章 矩陣
矩陣主要用來描述兩個座標系統間的關係,通過定義一種運算而將乙個座標系中的向量轉換到另乙個座標系中。注意 向量是標量的陣列,矩陣則是向量的陣列。矩陣的維度被定義為它包含了多少行和多少列。用黑體大寫字母表示矩陣,如 a,需要引用矩陣的分量時,採用下標法,常使用對應的斜體小寫字母 注意 矩陣的下標是從1 ...