解剖SQLSERVER 第九篇 OrcaMDF現在能通過系統DMVs顯示元數據(譯)
http://improve.dk/orcamdf-now-exposes-metadata-through-system-dmvs/
我坐在去丹麥的火車上,參加在北歐的SQL RALLY會議的最后一站。在演講的過程中,我根據OrcaMDF 的工作比較含蓄地宣布了OrcaMDF可以讀取元數據
現在,我也不妨在這里分享。除了在OrcaMDF中擴大對核心引擎的支持之外,另一個重要的我想要實現的主要功能之一就是顯示關于的你的數據庫的元數據
你的表,列,數據庫是怎麼展開的?
避免錯誤的抽象
我最初的想法是在上層對象下面創建自己的抽象層,你可以通過database.GetMetadata().UserTables 枚舉出你的所有的用戶表
你可以獲取用戶表的列表,包括數據列。從開發層面考慮這是一個非常清晰的接口,每樣東西都是普通的.NET對象。
然而,這需要我自己去定義抽象- 如何去劃分出哪些數據需要暴露,哪些數據不能,怎樣抽象對于DBA是最自然的,需不需要使用
類似SQLSERVER的 sys. DMVs
從SQLSERVER里暴露出內置的DMVs
我花費了一些時間考慮最后會有哪類人使用OrcaMDF ,最后得出結論是這個世界可能只有四類人會使用
而將這四類人再拆分開最終只有DBA和SQLSERVER開發人員。而他們通常會通過DVMs 例如sys.tables,sys.columns,sys.indexes
來瀏覽SQLSERVER數據庫的元數據。那么能夠使我有信心開發這個功能的動力是我已經能解析出所有的系統表,并且使用 SELECT OBJECT_DEFINITION()
我能夠看到內置的系統DMVs的源代碼。因此,創建我自己的內置DMVs的復制品是一件很簡單事
在OrcaMDF里如何使用DMVs
比如我們需要獲取某個表的所有列的信息,我們會建立如下SQL語句
SELECT c.* FROM sys.columns c INNER JOIN sys.tables t ON c.object_id = t.object_id WHERE t.name = 'Persons'
在OrcaMDF里的C#代碼里看起來會像這樣:
using (var db = new Database(new[] { @"C:Test.mdf" })) { var sys = db.Dmvs; var table = sys.Tables.Where(t => t.Name == "Persons").Single(); var columns = sys.Columns.Where(c => c.ObjectID == table.ObjectID); foreach (var col in columns) Console.WriteLine(col.Name); }
如果你更喜歡SQL-esque LINQ的語法,你當然可以像下面那樣做
using (var db = new Database(new[] { @"C:Test.mdf" })) { var sys = db.Dmvs; var columns = from c in sys.Columns join t in sys.Tables on c.ObjectID equals t.ObjectID where t.Name == "Persons" select c; foreach (var col in columns) Console.WriteLine(col.Name); }
不管使用哪種寫法,結果都會像下面那樣
可用的DMVs有哪些
如果你獲取到最新的已提交的OrcaMDF代碼,你可以訪問下面的DMVs,他們是通過SQLSERVER暴露出來的
sys.columns
sys.indexes
sys.index_columns
sys.objects
sys.objects$
sys.system_internals_allocation_units
sys.system_internals_partitions
sys.system_internals_partition_columns
sys.tables
sys.types
如果你對DMV 有期望可以跟我聯系,我會讓你愿望成真!
第九篇完
文章列表