讀古今文學網 > SQL入門經典 > 第七部分 摘要數據結構 >

第七部分 摘要數據結構

第20章 創建和使用視圖及異名

第21章 使用系統目錄

第20章 創建和使用視圖及異名

本章的重點包括:

什麼是視圖

如何使用視圖

視圖和安全

視圖的存儲

創建視圖

結合視圖

視圖裡的數據操作

什麼是異名

管理異名

創建異名

刪除異名

本章將介紹關於性能的一些知識,以及如何創建和刪除視圖,如何把視圖用於安全管理,如何簡化終端用戶和報告的數據獲取,最後還會討論異名。

20.1 什麼是視圖

視圖是一個虛擬表。也就是說,對於用戶來說,視圖在外觀和行為上都類似表,但它不需要實際的物理存儲。視圖實際上是由預定義查詢形式的表所組成的。舉例來說,從表EMPLOYEE_TBL裡創建一個視圖,它只包含僱員的姓名和地址,而不是表裡的全部字段。視圖可以包含表的全部或部分記錄,可以由一個表或多個表創建。

當創建一個視圖時,實際上是在數據庫裡執行了一個SELECT語句,它定義了這個視圖。這個SELECT語句可能只包含表裡的字段名稱,也可以包含各種函數和運算來操作或匯總給用戶顯示的數據。圖20.1展示了視圖的概念。

圖20.1 視圖

雖然視圖並不佔據實際的存儲空間,但也被看作是一個數據庫對象。視圖與表之間的主要區別在於,表佔據物理空間,而視圖不需要物理空間,它只是從表裡引用數據。

在數據庫裡,視圖的使用方式與表是一樣的,意味著我們可以像操作表一樣從視圖裡獲取數據。另外,我們還可以對視圖裡的數據進行操作,但存在著一定的限制。下面的小節將介紹視圖的一些常見應用,以及視圖在數據庫裡的保存方式。

警告:刪除用於創建視圖的表

如果用於創建視圖的表被刪除了,那麼這個視圖就不可訪問了。如果對這個視圖做查詢,就會收到錯誤信息。

20.1.1 使用視圖來簡化數據訪問

在有些情況下,通過數據庫的歸一化,或是數據庫設計的過程,數據在表裡的格式可能並不適合終端用戶進行查詢。這時,我們可以創建一系列的視圖,讓終端用戶能夠更簡單地進行查詢。舉例來說,用戶可能需要從數據庫 learnsql 裡查詢僱員的薪水信息,但並不完全理解如何創建表EMPLOYEE_TBL和EMPLOYEE_PAY_TBL之間的結合。為了解決這個問題,我們可以創建一個視圖來包含表的結合,讓用戶可以從這個視圖獲取數據。

20.1.2 使用視圖作為一種安全角式

提示:視圖可以被用作一種安全角式

使用視圖可以限制用戶只訪問表裡的特定字段或滿足一定條件的記錄(在定義視圖的WHERE子句裡指定)。

視圖可以作為數據庫裡的一種安全角式。假設我們有一個表EMPLOYEE_TBL,它包含僱員姓名、地址、電話號碼、緊急聯繫人、部門、職位、薪水或小時工資。在編寫一些報告時,可能會有一些臨時需求,要獲取僱員的姓名、地址和電話號碼。如果允許訪問整個表,別人就可以看到每個僱員的收入是多少,這是我們所不允許的。為了防止這種情況發生,我們可以創建一個視圖,讓它只包含必要的信息:僱員姓名、地址和電話號碼,並且讓寫報告的人可以使用這個視圖,這樣就可以避免他們訪問表的其他敏感數據。

20.1.3 使用視圖維護摘要數據

假如摘要數據報告所基於的表經常更新,或是報告經常被創建,使用視圖來包含摘要數據就是個很好的選擇。

舉例來說,有一個表包含個人信息,比如居住的城市、性別、薪水和年齡。我們可以基於這個表來創建一個視圖,統計每個城市的人員情況,比如平均年齡、平均薪水、男性總數、女性總數。在創建了視圖之後,如果想獲得這些信息,我們只需要對視圖進行查詢,而不需要使用複雜的SELECT語句。

利用摘要數據創建視圖與從一個表或多個表創建視圖的唯一區別就是使用了匯總函數。關於匯總函數的介紹請見第9章。

視圖只保存在內存裡,而且只需要保存其定義本身,這一點與其他數據庫對像不同。視圖由創建者或規劃所有者所擁有。視圖所有者自動擁有視圖的全部權限,並且可以把視圖的權限授予其他用戶。對於視圖來說,GRANT命令的GRANT OPTION權限的工作方式與表一樣。關於權限的詳細信息請見第19章。

20.2 創建視圖

視圖是通過CREATE VIEW語句創建的。我們可以從一個表、多個表或另一個視圖來創建視圖。為了創建視圖,用戶必須擁有適當的系統權限。

基本的CREATE VIEW語法如下所示:

下面的幾個小節分別介紹使用CREATE VIEW語句創建視圖的不同方法。

注意:ANSI SQL不包含ALTER VIEW語句

大多數數據庫實現裡提供了ALTER VIEW語句,但ANSI SQL裡沒有。舉例來說,在老版本的MySQL裡,我們可以使用REPLACE VIEW語句修改當前視圖。但是,最新版本的 MySQL以及 SQL Server和 Oracle都支持ALTER VIEW語句。詳細情況請參見具體實現的文檔。

20.2.1 從一個表創建視圖

我們可以從一個表創建視圖。

語法如下所示:

創建視圖的最簡單方式是基於單個表的全部內容,範例如下:

下面的範例從基表裡只選擇指定的字段,從而減少了視圖裡的內容:

下面的範例展示了如何利用基表裡的多個字段組合成視圖裡的一個字段。利用SELECT子句裡的別名,我們把視圖字段命名為NAME。

現在可以從視圖NAMES裡選擇全部數據:

下面的範例展示如何基於一個或多個表創建包含摘要數據的視圖:

現在,從這個摘要視圖裡選擇數據:

通過使用包含摘要數據的視圖,針對基表的SELECT語句可以得到簡化。

20.2.2 從多個表創建視圖

通過在SELECT語句裡使用JOIN,我們可以從多個表創建視圖。其語法如下:

下面是從多個表創建視圖的範例:

在從多個表創建視圖時,這些表必須在WHERE子句裡通過共同字段實現結合。視圖本身不過是一個SELECT語句而已,因此表在視圖定義裡的結合與在普通SELECT語句裡是一樣的。回憶一下,使用表的別名可以簡化多表查詢的可讀性。

視圖可以與表或其他視圖相結合,其規則與表之間的結合一樣。更多相關內容請見第13章。

20.2.3 從視圖創建視圖

使用下面的語法可以從一個視圖創建另一個視圖:

視圖創建視圖可以具有多個層次(視圖的視圖的視圖,以此類推),允許的層次取決於具體實現。基於視圖創建視圖的唯一問題在於它們的可管理性。舉例來說,基於 VIEW1 創建了VIEW2,又基於VIEW2創建了VIEW3。如果VIEW1被刪除了,VIEW2和VIEW3也就不可用了,因為支持這些視圖的底層數據不存在了。因此,我們需要始終很好地理解數據庫裡的視圖,以及它們依賴於什麼數據庫對像(參見圖20.2)。

圖20.2展示了視圖基於表和其他視圖的情況。VIEW1和VIEW2基於TABLE,VIEW3依賴於VIEW1,VIEW4依賴於VIEW1和VIEW2,VIEW5依賴於VIEW2。根據它們的關係, 我們可以得出以下結論:

如果VIEW1被刪除了,VIEW3和VIEW4就無效了;

如果VIEW2被刪除了,VIEW4和VIEW5就無效了;

如果TABLE被刪除了,這些視圖就都無效了。

圖20.2 視圖依賴

注意:謹慎選擇創建視圖的方式

如果從基表和從另一個視圖創建視圖具有一樣的難度和效率,那麼我們首選從基表創建視圖。

20.3 WITH CHECK OPTION

這是CREATE VIEW語句裡的一個選項,其目的是確保全部的UPDATE和 INSERT語句滿足視圖定義裡的條件。如果它們不滿足條件,UPDATE或INSERT語句就會返回錯誤。WITH CHECK OPTION實際上通過查看視圖定義是否被破壞來確保引用完整性。

下面是使用WITH CHECK OPTION創建視圖的範例:

在這個範例裡,WITH CHECK OPTION會確保視圖的PAGER字段裡不包含NULL值,因為視圖定義所依賴的數據裡不允許在PAGER字段裡包含NULL值。

嘗試在PAGER字段裡插入一個NULL值:

在基於視圖創建另一個視圖時,WITH CHECK OPTION有兩個選項:CASCADED和LOCAL,其中CASCADED是默認選項。CASCADED是ANSI標準語法。但是,Microsoft SQL Server和Oracle使用稍有不同的CASCADE關鍵字。在對基表進行更新時,CASCADED選項會檢查所有底層視圖、所有完整性約束,以及新視圖的定義條件。LOCAL 選項只檢查兩個視圖的完整性約束和新視圖的定義條件,不檢查底層的表。因此,使用CASCADED選項創建視圖是更安全的作法,基表的引用完整性也得到了保護。

20.4 從視圖創建表

我們可以從視圖創建一個表,就像從一個表創建另一個表(或從一個視圖創建另一個視圖)一樣。

語法如下:

注意:表與視圖的細微差別

表與視圖的主要區別在於表包含實際的數據、佔據物理存儲空間,而視圖不包含數據,而且只需要保存視圖定義(查詢語句)。

首先,基於兩個表創建一個視圖:

接下來,基於前面這個視圖創建一個表:

注意:在查詢視圖時使用ORDER BY子句

與在 CREATE VIEW 語句裡使用 GROUP BY 子句相比,在查詢視圖的SELECT語句裡使用ORDER BY子句更簡單、效果更好。

最後,從這個表裡選擇數據:

20.5 視圖與ORDER BY子句

CREATE VIEW語句裡不能包含ORDER BY子句,但是GROUP BY子句用於CREATE VIEW語句時,可以起到類似ORDER BY子句的作用。

下面是在CREATE VIEW語句裡使用GROUP BY子句的範例:

如果從這個視圖裡選擇全部數據,它們是以字母順序排列的(因為根據NAME進行了分組)。

20.6 通過視圖更新數據

在一定條件下,視圖的底層數據可以進行更新:

視圖不包含結合;

視圖不包含GROUP BY子句;

視圖不包含UNION語句;

視圖不包含對偽字段ROWNUM的任何引用;

視圖不包含任何組函數;

不能使用DISTINCT子句;

WHERE子句包含的嵌套的表表達式不能與FROM子句引用同一個表。

視圖可以執行INSERT、UPDATE和DELETE等語句,

關於UPDATE命令的語法請見第14章。

20.7 刪除視圖

DROP VIEW命令用於從數據庫裡刪除視圖,它有兩個選項:RESTRICT和CASCADE。如果使用了RESTRICT選項進行刪除操作,而其他視圖在約束裡有所引用,刪除操作就會出錯。如果使用了CASCADE選項,而且其他視圖或約束被引用了,DROP VIEW也會成功, 而且底層的視圖或約束也會被刪除。範例如下:

20.8 嵌套視圖對性能的影響

在查詢中使用視圖,與使用表有著相同的性能特性。因此,用戶必須意識到,在視圖中隱藏複雜的邏輯會導致系統需要查詢底層表來分析並組合數據。在進行性能調整的時候,視圖需要和其他SQL語句一樣被調整。如果構成視圖的查詢沒有經過事先設計,那麼視圖本身就會對性能產生影響。

此外,有些用戶將查詢分解為各種視圖構成的多個單元,以便簡化複雜的查詢。這種方法在簡化複雜邏輯方面看起來是個好辦法,但卻會降低性能。因為搜索發動機需要分析每一層的視圖,來確定為了完成搜索需要進行哪些工作。

嵌套的層數越多,搜索發動機為了獲得一個執行計劃而需要進行的分析工作就越多。實際上,大多數搜索發動機無法確保獲得一個完美的執行計劃,而只能保證執行一個耗時最短的計劃。因此,最好的方法就是,盡量減少代碼中的嵌套層數,並且測試並調整創建視圖所用到的語句。

注意:異名不屬於ANSI SQL標準

異名並不屬於ANSI SQL標準,但由於多個主流實現都在使用它,我們最好還是在此討論一下。關於異名的使用請查看具體實現的文檔。MySQL不支持異名,但我們可以使用視圖來實現同樣的功能。

20.9 什麼是異名

異名就是表或視圖的另一個名稱。我們創建別名通常是為了在訪問其他用戶的表或視圖時不必使用完整限制名。異名可以創建為PUBLIC或PRIVATE,PUBLIC的異名可以被數據庫裡的其他用戶使用,而PRIVATE異名只能被所有者和擁有權限的用戶使用。

異名由數據庫管理員(或某個指定的人員)或個人用戶管理。由於異名有兩種類型:PUBLIC和PRIVATE,在創建異名時可能需要不同的系統級權限。一般來說,全部用戶都可以創建PRIVATE異名,而只有數據庫管理員(DBA)或被授權的用戶可以創建PUBLIC異名,詳細情況請參見具體實現的文檔。

20.9.1 創建異名

創建異名的一般語法如下所示:

下面的範例為表CUSTOMER_TBL創建一個異名:CUST,之後我們再引用這個表就不用輸入完整的表名了。

異名的另一個常見應用是,表的所有者給表創建一個異名,這樣其他有權限訪問這個表的用戶不必在表的名稱前面添加所有者名稱也可以引用這個表了。

20.9.2 刪除異名

刪除異名與刪除其他數據庫對像很類似,一般語法如下所示:

範例如下:

20.10 小結

本章討論了SQL裡兩個重要特性:視圖和異名。在很多情況下,這些能夠對關係型數據庫用戶有所幫助的特性並沒有得到充分應用。視圖就是一個虛擬表——外觀與行為都像表,但不像表那樣佔據物理空間。視圖實際上是由對表和其他視圖的查詢所定義的,其主要用於限制用戶能夠查看的數據、簡化數據和進行數據摘要。視圖可以基於視圖創建,但要注意不要嵌套太多的層次,以避免失去對它們的管理控制。創建視圖時有多個選項,有些實現還具有自己特殊的選項。

異名也是數據庫裡的對象,它代表著其他對象。我們可以創建一個短的異名來代表名稱較長的對象,或是代表被其他用戶所擁有的對象,從而簡化數據庫裡對像名稱的使用。異名有兩種類型:PUBLIC 和 PRIVATE。PUBLIC 異名可以被數據庫裡的全部用戶訪問,而PRIVATE異名只被單個用戶訪問。DBA通常負責創建PUBLIC異名,而個人用戶通常創建自己的PRIVATE異名。

20.11 問與答

問:視圖怎麼能包含數據而又不佔據存儲空間呢?

答:視圖不包含數據,它是一個虛擬表,或是一個存儲的查詢。視圖所需的空間只是定義語句所需要的。

問:如果視圖所基於的視圖被刪除了,它會怎麼樣?

答:這個視圖就無效了,因為底層的數據已經不存在了。

問:在創建異名時,其名稱有什麼限制?

答:這取決於具體的實現。在大多數主流實現裡,異名的命名規則與數據庫裡表和其他對象的命名規則一樣。

20.12 實踐

下面的內容包含一些測試問題和實戰練習。這些測試問題的目的在於檢驗對學習內容的理解程度。實戰練習有助於把學習的內容應用於實踐,並且鞏固對知識的掌握。在繼續學習之前請先完成測試與練習,答案請見附錄C。

20.12.1 測驗

1.在一個基於多個表創建的視圖裡,我們可以刪除記錄嗎?

2.在創建一個表時,所有者會自動被授予適當的權限。在創建視圖時也是這樣嗎?

3.在創建視圖時,使用什麼子句對數據進行排序?

4.在基於視圖創建視圖時,使用什麼選項檢查完整性約束?

5.在嘗試刪除視圖時,由於存在著多個底層視圖,操作出現了錯誤。這時怎樣做才能刪除視圖?

20.12.2 練習

1.編寫一個語句,基於表EMPLOYEE_TBL的全部內容創建一個視圖。

2.編寫一個語句創建一個包含摘要數據的視圖,顯示表 EMPLOYEE_TBL 裡每個城市的平均小時工資和平均薪水。

3.再次創建練習2中的摘要數據視圖,但不要使用表EMPLOYEE_TBL,而是使用練習1中所創建的視圖。比較兩個結果。

4.使用練習2中創建的視圖來創建一個名為EMPLOYEE_PAY_SUMMARIZED的表。想辦法確定視圖和表擁有相同的數據。

5.編寫SQL語句來刪除表和剛剛創建的視圖。

第21章 使用系統目錄

本章的重點包括:

什麼是系統目錄

如何創建系統目錄

系統目錄裡包含什麼數據

系統目錄表的範例

查詢系統目錄

更新系統目錄

本章介紹系統目錄,在某些關係型數據庫的實現裡,這也被稱為數據目錄。本章將介紹系統目錄的作用與內容,以及如何對它進行查詢來獲得數據庫的信息。每種主流實現都具有某種形式的系統目錄,保存了關於數據庫本身的信息。本章中將展示書中所涉及的不同實現裡系統目錄所包含的元素。

21.1 什麼是系統目錄

系統目錄是一些表和視圖的集合,它們包含了關於數據庫的信息。每個數據庫都有系統目錄,其中定義了數據庫的結構,還有數據庫所包含數據的信息。舉例來說,用於數據庫裡所有表的數據目錄語言(DDL)就保存在系統目錄裡。圖21.1展示了數據庫的系統目錄。

從圖21.1可以看出,系統目錄實際上是數據庫的組成部分。數據庫裡包含的是對象,比如表、索引和視圖。系統目錄基本上就是一組對象,包含了定義數據庫裡其他對象的信息、數據庫本身的結構以及其他各種重要信息。

在具體實現裡,系統目錄的內容會被劃分為對象的邏輯組,以表的形式供數據庫管理員(DBA)和其他數據庫用戶訪問。舉例來說,某個用戶可能需要查看自己具有的數據庫權限,但不需要知道數據庫內部結構或進程。普通用戶通常可以對系統目錄進行查詢來獲得關於所擁有對象和權限的信息,而 DBA 需要能夠獲取數據庫裡任何結構或事件的信息。在某些實現裡,有些系統目錄的對象只能由DBA訪問。

圖21.1 系統目錄

系統目錄對於 DBA 或其他需要瞭解數據庫結構和特徵的用戶來說都是非常重要的。在數據庫用戶沒有使用GUI界面時,它尤為重要。系統目錄不僅允許DBA和用戶,而且允許數據庫服務程序本身對其進行維護。

注意:不同實現的系統目錄有所不同

每個實現對系統目錄的表和視圖都具有自己的命名規則。名稱本身並不重要,重要的是功能,以及它包含什麼內容、如何檢索這些內容。

21.2 如何創建系統目錄

系統目錄或者是在數據庫創建時自動創建的,或是由 DBA 在數據庫創建之後立即創建的。舉例來說,Oracle數據庫會運行一系列由廠商提供的預定義SQL腳本,創建系統目錄裡全部的表格和視圖。系統目錄的表格和視圖是由系統所擁有的,不屬於任何規劃。舉例來說,在 Oracle 裡,系統目錄的所有者是一個名為 SYS 的用戶,它對數據庫具有完全的權限。在Microsoft SQL Server裡,SQL服務程序的系統目錄位於master數據庫裡。在MySQL裡,系統目錄位於mysql數據庫裡。系統目錄保存的實際位置請查看具體實現的文檔。

21.3 系統目錄裡包含什麼內容

系統目錄裡包含多種信息,可以被很多用戶訪問,但有時不同用戶的使用目的並不一樣。

系統目錄包含的內容有:

用戶賬戶和默認設置;

權限和其他安全信息;

性能統計;

對像大小估計;

對像變化;

表結構和存儲;

索引結構和存儲;

數據庫其他對象的信息,比如視圖、異名、觸發器和存儲過程;

表約束和引用完整性信息;

用戶會話;

審計信息;

內部數據庫設置;

數據庫文件的位置。

系統目錄由數據庫服務程序維護。舉例來說,當一個表被創建時,數據庫服務程序把數據插入到系統目錄裡適當的表或視圖。當表的結構被修改時,系統目錄裡相應的對象也被更新。下面這些小節分別介紹系統目錄裡所包含的信息。

21.3.1 用戶數據

關於個人用戶的全部信息都保存在系統目錄裡:用戶具有的系統和對像權限、用戶擁有的對象、用戶不擁有但能夠訪問的對象。用戶可以通過查詢訪問用戶表或視圖。關於系統目錄對象的詳細情況請參見具體實現的文檔。

21.3.2 安全信息

系統目錄也保存安全信息,比如用戶標識、加密的密碼、各種權限和權限組。有些實現裡包含審計表,可以跟蹤數據庫發生的事件,包括由誰引發、何時等信息。在很多實現裡,利用系統目錄還可以密切監視數據庫用戶會話。

21.3.3 數據庫設計信息

系統目錄包含關於數據庫的信息,包括數據庫的創建日期、名稱、對像大小估計、數據文件的大小和位置、引用完整性信息、索引、每個表的字段信息和屬性。

21.3.4 性能統計

性能統計一般也在系統目錄裡,包括關於 SQL 語句性能的信息,比如優化器執行 SQL語句的時間和方法。其他性能信息還有內存分配和使用、數據庫裡剩餘空間、控制表格和索引碎片的信息。利用這些信息可以調整數據庫,重新安排SQL查詢,重新設計訪問數據的方法,從而得到更好的整體性能和更快的SQL查詢響應。

21.4 不同實現裡的系統目錄表格

每個實現都有一些表格和視圖來構成系統目錄,有些還分為用戶級、系統級和DBA級。

關於系統目錄表格的詳細情況請參見具體實現的文檔,表21.1列出了主流實現的範例。

表21.1 主流實現的系統目錄對像

上面只是列出了書中涉及的一些關係型數據庫實現裡的部分系統目錄對象,主要是比較類似的對象。每個實現在系統目錄內容的組織方面都是很獨特的。

21.5 查詢系統目錄

我們可以像對待數據庫裡的其他表格和視圖一樣使用 SQL 查詢系統目錄裡的表格和視圖。用戶通常只能查詢與用戶相關的表,不能訪問系統表,後者通常只能由被授權的用戶訪問,比如DBA。

創建查詢從系統目錄裡獲取數據與對數據庫的其他表格進行操作是一樣的。舉例來說,下面的查詢從Microsoft SQL Server的表SYS.TABLES裡返回全部記錄:

下面的查詢返回數據庫裡的全部用戶賬戶,它運行於MySQL系統數據庫上:

注意:有關下面的範例

下面的範例使用MySQL的系統目錄。在此選擇使用MySQL沒有特別的意圖,只是選擇了本書所涉的一種數據庫實現而已。

下面的範例列出我們的learnsql規劃裡的全部表格,它運行於information_schema上:

警告:不要手動修改系統目錄中的表

不要以任何方式直接操作系統目錄裡的表(只有DBA能夠操作系統目錄的表),否則可能會破壞數據庫的完整性。與數據庫結構有關的信息,以及數據庫的全部對象都保存在系統目錄中,它通常是與數據庫裡的其他數據隔離的。有些實現,例如Microsoft SQL Server,不允許用戶手動修改系統目錄中的表,以確保系統的完整性。

下面的查詢返回數據庫用戶BRANDON的全部系統權限:

注意:本小節所涉信息有限

本小節範例中返回的信息與實際系統目錄相比簡直是九牛一毛。在實際工作中,最好把系統目錄返回的信息輸出到文件,打印出來作為參考。關於系統目錄裡表格以及表格內字段的詳細情況請參見具體實現的文檔。

21.6 更新系統目錄對像

系統目錄只能執行查詢操作——DBA也是如此。系統目錄的更新是由數據庫服務程序自動完成的。舉例來說,當用戶發出CREATE TABLE命令時,數據庫裡會創建一個表,數據庫服務程序就會把創建這個表的DDL放到系統目錄裡適當的表裡。

系統目錄裡的表從不需要進行手工更新,即使用戶有這個能力也不需要。數據庫服務程序會根據數據庫裡發生的行為對系統目錄進行相應的更新,如圖21.2所示。

圖21.2 更新系統目錄

21.7 小結

本章介紹了關係型數據庫的系統目錄。從某種意義來說,系統目錄是數據庫裡的數據庫,包含了與其所在數據庫相關的全部信息,用於維護數據庫的整體結構、跟蹤數據庫裡發生的事件與改變、為數據庫整體管理提供各種信息。系統目錄只能執行查詢操作,沒有用戶應該對系統目錄進行直接修改。然而,在數據庫結構本身發生任何一次變化時,比如創建表,數據庫服務程序都會自動對系統目錄進行更新。

21.8 問與答

問:作為一名數據庫用戶,我知道可以獲取我的對象的信息,但如何才能得到其他用戶的對象的信息呢?

答:用戶可以利用一組表或視圖對系統目錄的大部分信息進行查詢,其中就包括所訪問對象的信息。為了瞭解其他用戶的情況,我們需要查看包含相應內容的系統目錄。舉例來說,在Oracle裡,我們可以查看系統目錄DBA_TABLES和DBA_USERS。

問:如果用戶忘記了密碼,DBA是否可以通過查詢某個表而獲得這個密碼呢?

答:是,也不是。密碼被保存在一個系統表格裡,通常是加密的,所以即使 DBA 也不能讀取這個密碼。如果用戶忘記了密碼,密碼就必須被重置,而這是DBA能夠輕易完成的。

問:如何瞭解系統目錄表格裡包含了什麼字段?

答:系統目錄表格可以像其他表格一樣被查詢,所以只要查詢適當的表就可以獲得這個信息。

21.9 實踐

下面的內容包含一些測試問題和實戰練習。這些測試問題的目的在於檢驗對學習內容的理解程度。實戰練習有助於把學習的內容應用於實踐,並且鞏固對知識的掌握。在繼續學習之前請先完成測試與練習,答案請見附錄C。

21.9.1 測驗

1.在某些實現裡,系統目錄也被稱為什麼?

2.普通用戶能夠更新系統目錄嗎?

3.在Microsoft SQL Server裡,哪個系統表格包含了數據庫裡視圖的信息?

4.誰擁有系統目錄?

5.Oracle數據對像ALL_TABLES和DBA_TABLES之間的區別是什麼?

6.誰修改系統表格?

21.9.2 練習

1.在第19章中,我們查看了mysql裡的系統表格。現在查看一些本章中討論過的系統表,複習一下這些表格。

2.在提示符下,輸入命令來獲取以下信息:

所有表的信息。

所有視圖的信息。

數據庫中所有的用戶名。

3.使用多個系統表來編寫查詢,獲得learnsql數據庫中的所有用戶及其權限。