继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

OrcaMDF现在能通过系统DMVs显示元数据(译)

英明神武的牛
关注TA
已关注
手记 317
粉丝 30
获赞 175

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 cINNER JOIN    sys.tables t ON c.object_id = t.object_idWHERE    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.columnssys.indexessys.index_columnssys.objectssys.objects$sys.system_internals_allocation_unitssys.system_internals_partitionssys.system_internals_partition_columnssys.tablessys.types

复制代码

 

如果你对DMV 有期望可以跟我联系,我会让你愿望成真!


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP