我們學、用 .Net的都知道,程序集 (Assembly)的一個很大的優點就是它有元數據,可以 “自描述 ”。在我們體驗這種優勢的同時,我們是否想過什麼時候數據庫中的信息也是自描述的該多好?
我想 Sql Server中有擴展屬性,並且 SQL Server的 “元數據 ”,其實都可以通過一些系統表、系統視圖等中查到,所以我想為何不利用一下這些擴展屬性,讓數據庫中的表、視圖、字段等也來一個自我描述,省去手工維護那些 Excel格式之類的外部數據字典的麻煩?
以下是我的初步實踐,可能並不完美,希望可以給大家一個拋磚引玉的效果就好。
首先,對於數據表中字段,因為在你用 SSMS給一個表添加字段的時候,就有一個屬性可以填寫一個描述,因此獲取這些描述信息自然是非常簡單的,我實現了如下視圖:
CREATE VIEW [dbo].[DOC_vwColumns]
AS
-- 數據表字段的說明
-- 作者:RickyLin, http://Ricky81317.cnblogs.com/
SELECT T.Table_Name, C.Column_Name, C.Data_Type, C.Character_Maximum_Length, C.Is_Nullable, P.[Value] AS ColumnDescription
FROM INFORMATION_SCHEMA.Tables T
INNER JOIN INFORMATION_SCHEMA.Columns C ON C.Table_Name = T.Table_Name
LEFT JOIN Sys.Extended_PropertIEs P ON P.Major_ID = Object_ID(T.Table_Name) AND P.Minor_ID = C.Ordinal_Position AND P.[Name] = 'MS_Description'
WHERE T.Table_Type = 'BASE TABLE'
--ORDER BY T.Table_Name, C.Ordinal_Position
通過查詢這個視圖,就可以得到各個數據表中的字段的說明,而且因為是一個視圖,所以可以通過添加 Where條件,從這個視圖中篩選出你需要的個別表的字段信息
對於數據庫中的表、視圖、存儲過程、函數等,在你創建的時候,並沒有一個明顯的可以填寫 “描述 ”的地方,但是,當你創建這些數據庫對象完成之後,可以現在 SSMS中選中這個對象,然後右鍵 -->屬性,就可以在屬性對話框的左邊的找到 “擴展屬性 ”,然後在擴展屬性中增加一條,用來描述對象的信息。我是使用 ObjectDescription這個名字添加的擴展屬性,添加完成之後,點擊確定。然後可以利用以下視圖進行查詢:
CREATE VIEW [dbo].[DOC_vwObjects]
AS
-- 數據庫對象的說明
-- 作者:RickyLin, http://Ricky81317.cnblogs.com/
SELECT T.[Object_ID] AS ObjectID, T.[Name] AS ObjectName, T.[Type] AS ObjectType, P.[Value] AS ObjectDescription
FROM Sys.Objects T
LEFT JOIN Sys.extended_propertIEs P ON P.Major_ID = T.[Object_ID]
WHERE P.[Name] = 'ObjectDescription'
是不是很簡單?
通過這種方法,可以為我們的數據庫建立起一個自描述的方式,可以用比較方便的方法,維護和查詢說明信息,並且在無論我們備份還是分離數據庫,這些描述信息都是在數據庫裡面隨著數據庫文件走(這也是自描述的優勢啊),不需要額外的附帶著其他文件性質說明文檔。就算要一份最新的 Excel格式的數據庫字典,也只需要查詢出結果,然後復制、粘貼到 Excel裡面就行了。