關於SQL Server數據庫的一切信息都保存在它的系統表格裡。我懷疑你是否花過比較多的時間來檢查系統表格,因為你總是忙於用戶表格。但是,你可能需要偶爾做一點不同尋常的事,例如數據庫所有的觸發器。你可以一個一個地檢查表格,但是如果你有500個表格的話,這可能會消耗相當大的人工。
這就讓sysobjects表格有了用武之地。雖然我不建議你更新這個表格,但是你當然有權對其進行審查。
在大多數情況下,對你最有用的兩個列是sysobjects.name和sysobjects.xtype。前面一個用來列出待考察對象的名字,而後一個用來定義對象的類型,其代碼如下:
C:檢查約束。
D:默認的約束
F:外鍵約束
L:日志
P:存儲過程
PK:主鍵約束
RF:復制過濾存儲過程
S:系統表格
TR:觸發器
U:用於表格。
UQ:獨特的約束。
V:視圖
X:被擴展的存儲過程
在碰到觸發器的情形下,用來識別觸發器類型的其他三個列是:deltrig、instrig和uptrig。
你可以用下面的命令列出感興趣的所有對象:
SELECT * FROM sysobjects WHERE xtype = <type of interest>
在特殊情況下,也就是在父表格擁有觸發器的情況下,你可能想要用下面這樣的代碼查找數據庫:
SELECT
Sys2.[name] TableName,
Sys1.[name] TriggerName,
CASE
WHEN Sys1.deltrig > 0 THEN'Delete'
WHEN Sys1.instrig > 0 THEN'Insert'
WHEN Sys1.updtrig > 0 THEN'Update'
END'TriggerType'
FROM
sysobjects Sys1 JOIN sysobjects Sys2 ON Sys1.parent_obj = Sys2.[id]
WHERE Sys1.xtype='TR'
ORDERBY TableName
在SQL Server 2005裡,首選的技術是使用系統視圖。這種方式會把你的查詢同微軟選擇對系統表格進行的任何改變隔絕開來。
下面是一個簡單的例子,它使用了INFORMATION_SCHEMA_TABLES視圖:
SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE
FROMINFORMATION_SCHEMA.TABLES
ORDERBY TABLE_SCHEMA, TABLE_NAME
對於AdventureWorks數據庫或者任何你自己的數據庫,使用這個查詢可以產生一個表格快速列表。
為了說明這些架構查詢的能力,看下面的語句,它們列出所選數據庫裡所有的函數和存儲過程。
SELECT*FROMINFORMATION_SCHEMA.ROUTINES
ORDERBY ROUTINE_TYPE, ROUTINE_NAME
市面上有20種這樣的信息架構視圖。如果你需要將數據庫歸檔,而且無法承擔商業解決方案,例如Red Gate或者Apex提供的方案的話,那麼通過這些視圖和一點點試驗,你就可以讓SQL Server給自己生成文檔了。