SQL Server 中維護了一組表用於存儲 SQL Server 中所有的對象、數據類型、約束條件、配置選項、可用資源等信息,這些信息稱爲元數據信息(Metadata),而這些表稱爲系統基礎表(System Base Tables)。在這些基礎表中,存在於 master 數據庫中的一部分基礎表包含系統級範圍的信息。存在於特定數據庫(也包含 master db)中的基礎表包含屬於該特定數據庫的對象和資源信息。
使用系統管理員身份登錄,可以從 sys.objects 中查詢所有的系統基礎表。
USE master; SELECT [name] ,type_desc FROM sys.objects WHERE type_desc = 'SYSTEM_TABLE' ORDER BY [name];
系統基礎表僅在數據庫引擎內部使用,並不是提供的通用功能,所以當變化時可能無法保證兼容性。這些以 "sys" 爲前綴的表對象,例如 sysobjects, sysindexes, sysusers, sysdatabases 等,實際上是兼容視圖(Compatibility Views)。SQL Server 通過提供兼容視圖的集合來保持向後兼容(Backward Compatibility),使得基於這些兼容視圖構建的應用程序不會被破壞。而新增的特性,例如表分區、資源調控等將不會被添加到這些視圖中。
目前,SQL Server 推薦的訪問元數據信息的常規接口是目錄視圖(Catalog Views)。所有的目錄視圖,包括動態管理視圖 DMV(Dynamic Management Views)和兼容視圖(Compatibility Views),均存在於 "sys" Schema 中。
SELECT SCHEMA_NAME(schema_id) AS schema_name ,[name] AS object_name ,type_desc FROM sys.all_objects WHERE SCHEMA_NAME(schema_id) = 'sys' AND type_desc = 'VIEW' ORDER BY object_name;
名稱爲 "sys.dm_" 開頭的對象即爲動態管理視圖 DMV(Dynamic Management Views)。這些動態管理對象中既有視圖也有函數,但大部分是視圖,所以通常稱爲動態管理視圖 DMV(Dynamic Management Views)。DMV 不是基於數據庫文件的真實的表,而是基於內部數據庫結構的展現。根據 DMV 對象展示的信息的職責範圍,它們被分成若干個目錄。
- dm_exec_* 包含與用戶代碼執行和 Session 相關的信息。
- dm_os_* 包含低層系統信息,如 Memory、Locking、Scheduler 等。
- dm_tran_* 包含事務的細節信息。
- dm_io_* 包含網絡和磁盤 I/O 活動相關的信息。
- dm_db_* 包含數據庫和數據庫對象的細節信息,如 Index 等。
目錄視圖(Catalog Views)是構建在繼承模型(Inheritance Model)上的,使得對象的通用屬性不必在內部進行重複定義。例如 sys.objects 包含了各種對象類型的通用屬性,而 sys.tables 繼承自 sys.objects,所以首先包含有與 sys.objects 完全相同的列,然後再添加特定對象類型的附加列。
可以在 SQL Server 2008 R2 System Views Map 位置下載目錄視圖的映射關係圖。
如果要查詢某個目錄視圖的定義,可以使用 object_definition 函數或 sp_helptext 進行查詢。
SELECT object_definition (object_id('sys.tables'));
EXEC sp_help 'sys.tables'; EXEC sp_helptext 'sys.tables';
訪問 SQL Server 元數據信息還有一些其他方式:
- 信息架構視圖(Information Schema Views)
- 系統函數(System Functions)
- 系統存儲過程(System Stored Procedures)
例如,通過系統函數查詢指定數據庫的恢復模型。
SELECT SERVERPROPERTY('Edition') AS Edition ,SERVERPROPERTY('EngineEdition') AS EngineEdition ,DATABASEPROPERTYEX('msdb', 'Recovery') AS RecoveryModel;
目錄視圖(Catalog Views)是訪問 SQL Server 元數據信息的首選接口,其次是系統函數(System Functions)。