SQL Server 2005 - 探討資料表的類型

摘要:SQL Server 2005 - 探討資料表的類型

Microsoft® SQL Server™ 的 資料表可分為三種類型,它們分別是使用者資料表、暫存資料表與系統資料表。相信大家對使用者資料表絕對不會陌生,因為本章至目前為止,指導您如何建立與維 護的資料表皆是使用者資料表,顯而易見地,由使用者自行建立,以便用來永久儲存特定性質之資料記錄的資料表便是使用者資料表。 

至於暫存資料表與系統資料表則有其特定的功能與用途,本節筆者針對此一部分加以說明,以便讓大家對 Microsoft® SQL Server™ 的資料表有更完整且全面的認識。 

暫存資料表

顧名思義,暫存資料表就是暫存資料的儲存處,於系統執行過程中,我們經常需要執行一些複雜的運算與處理,在此期間不免會產生一些階段性與過渡性的資料,這些資料在整個處理作業完成後便不再需要而必須刪除,像此類資料就非常適合存放於暫存資料表。 

暫存資料表亦是由開發者自行建立,特別的是,不管您於任何資料庫中建立暫存資料表,暫存資料表皆固定存放於系統資料庫 tempdb中,而且一旦不使用會自動被刪除。您可別以為針對暫存資料表所做的異動不會被記錄於記錄檔(Log File)中,事實上暫存資料表僅會記錄最少量的記錄,以便在需要時能夠將異動交易復原(RollBack)。然而由於每當SQL Server重新啟動時就會重新建立一個全新的 tempdb,因此當系統重新啟動時 tempdb 的記錄檔不會被用來進行復原處理。同樣地,tempdb也不會自備份中回存,因此tempdb的記錄檔於回存資料庫時是完全不需要的。 

Microsoft® SQL Server™中,暫存資料表可區分為下列兩種類型: 

r 區域性暫存資料表

不論目前哪一個資料庫是作用資料庫,只要您建立資料表時,以井字號(#)作為其名稱的第一個字元,則此資料表將成為一個存放在 tempdb 中的區域性暫存資料表(例如:CREATE TABLE #MyTable. . .)。區域性暫存資料表只有建立它之連線的使用者能夠存取它,而且一旦此位使用者切斷與 SQL Server 的連線,區域性暫存資料表會自動被刪除,當然,此位使用者也可以在連線期間以 DROP TABLE 陳述式來刪除他所建立的區域性暫存資料表。

由於區域性暫存資料表的適用範圍僅限於建立它的連線,因此您不需擔心其名稱會與其他連線所採用的名稱相同。

r 全域性暫存資料表

不論目前哪一個資料庫是作用資料庫,只要您所建立之資料表的名稱是以兩個井字號(##)開頭,則此資料表將成為一個存放在 tempdb 中的全域性暫存資料表(例如:CREATE TABLE ##MyTable. . .)。全域性暫存資料表一旦被建立,後續連線至此 SQL Server 的任何使用者都能夠存取它(包括讀取與寫入),而且不需要特定的權限。

當建立全域性暫存資料表的使用者切斷與 SQL Server 的連線,SQL Server 會檢查是否有其他使用者正在使用此全域性暫存資料表,如果沒有,便立即將全域性暫存資料表刪除;如果有,SQL Server 會讓這些正在存取中的作業繼續進行,但是不允許任何使用者再去存取全域性暫存資料表,等到所有未完成的作業執行完畢後,全域性暫存資料表會自動被刪除。

由於全域性暫存資料表能夠被所有的連線使用,因此您必須注意其名稱不能與其他連線所採用的名稱相同。 

其實只要您擁有足夠的權限,也可以直接在系統資料庫 tempdb 中建立資料表,而且依此法所建立的資料表並不會在您切斷與 SQL Server 的連線後自動被刪除,除非您以 DROP TABLE 陳述式將它刪除或是 SQL Server 重新啟動,否則它是不會被刪除的。以下面的陳述式而言,表示在系統資料庫 tempdb 中建立一個名為 TempTable 的暫存資料表: 

USE tempdb;
CREATE TABLE TempTable (name varchar(16));

-或-

CREATE TABLE tempdb.dbo.TempTable (name varchar(16))
 

有些人說,條件約束(Constraints)無法使用於暫存資料表,此一說法並不完全正確。事實上所有的條件約束都可使用於直接在系統資料庫 tempdb 中建立的暫存資料表(亦即名稱並非以 # ## 開頭者),而除了 FOREIGN KEY 以外的所有條件約束也都能夠使用於區域性暫存資料表(名稱以 # 開頭者)與全域性暫存資料表(名稱以 ## 開頭者)。 

附註:
關於條件約束的說明請參閱SQL Server 2005 完全實戰」一書之第六章。 

請注意:
在此要特別提醒大家,於 SQL Server 中應儘可能使用 table 資料型別的變數來取代暫存資料表,其好處請參閱SQL Server 2005 完全實戰」一書的說明 

系統資料表 

系統資料表是 Microsoft® SQL Server™ 內建的資料表,其中存放著 Microsoft® SQL Server™ 及其元件所使用到的相關系統資訊,說明如下:

 

r  系統資料表會存放關於系統與資料庫中之物件的資訊,我們通常將此類資訊稱之為「中繼資料」(Metadata

中繼資料係泛指下列資訊: 

Ø 與資料之特性相關的資訊,例如欄位的資料型別、長度...等等。

Ø 與資料之結構相關的資訊。

Ø 用以指定物件之設計方式的資訊。

 

r 每一個資料庫(包括 master 在內)都會內含一組用以儲存與此資料庫相關之中繼資料的系統資料表,SQL Server 稱此組系統資料表為「資料庫目錄」(Database Catalog

r  在系統資料庫 master 中,有一組系統資料表用以儲存關於整個系統與其他所有資料庫的中繼資料,SQL Server 稱此組系統資料表為「系統目錄」(System Catalog

系統目錄只會存在於系統資料庫 master 中。 

系統資料表

所屬的資料庫

功能用途

syslogins

master

能夠連線至SQL Server的登入帳號即是記錄於系統資料表sysxlogins中,亦即syslogins中的每一筆資料記錄即代表一個能夠連結至SQL Server的登入帳號。如果您需要去存取syslogins中的資訊,請透過系統檢視表sys.server_principals來完成。

sysmessages

master

系統資料表sysmessages中的每一筆資料記錄即代表SQL Server能夠傳回的系統錯誤或警告。如果您需要去存取syslogins中的資訊,應透過系統檢視表sys.messages來完成。

sysdatabases

master

系統資料表sysdatabases中的每一筆資料記錄即代表SQL Server中的每一個資料庫。如果您需要去存取syslogins中的資訊,應透過系統檢視表sys.databases來完成。

sysusers

所有的資料庫

系統資料表sysusers中的每一筆資料記錄,即代表所屬資料庫中的每一個Windows使用者、Windows群組、SQL Server使用者或SQL Server角色。如果您需要去存取syslogins中的資訊,請透過系統檢視表sys.database_principals來完成。

sysobjects

所有的資料庫

系統資料表sysobjects中的每一筆資料記錄,即代表所屬資料庫中的每一個物件。如果您需要去存取syslogins中的資訊,應透過系統檢視表sys.objects來完成。

圖表1

所有系統資料表皆以 sys 作為其名稱的開頭(例如:systypes),筆者特於圖表1列出一些經常被使用到的系統資料表及其功能用途(SQL Server 中的系統資料表多達數十個,關於各個系統資料表的用途請參閱軟體所附的線上叢書)。 

SQL Server 2005 改用「系統檢視表」(System Views提供伺服器上每個資料庫中之系統目錄的中繼資料,為了讓大家可以望字生義,所有的系統檢視表皆以 sys. 作為其名稱的開頭(例如:sys.types),因此我們只要透過 SELECT陳述式並選用合適的系統檢視表就能查詢到系統資料表相關的中繼資料。比方說,我們要查詢目前使用的資料庫中,系統資料類型和使用者自訂資料類型的詳細資訊有哪些,就可以使用下列的命令描述來得知: 

SELECT * FROM sys.types 

相信您可以瞭解,系統資料表內含許多關於系統、資料庫以及資料庫中之物件的有用資訊,或許您的應用程式正需要使用這些資訊。但是請注意,如果您的應用程式需要自系統資料表取得相關資訊,絕對不可以直接使使用 SELECT 陳述式去查詢系統資料表,而必須透過下列元件來取得:

 

r 資訊結構描述檢視表(Information Schema Views

r 系統預存程序

r Transact-SQL 陳述式與函數

r SMOSQL Server Management Objects

r 覆寫管理物件(Replication Management ObjectsRMO

r 資料庫應用程式介面(API)目錄函數