解剖SQLSERVER 第九篇 OrcaMDF现在能通过系统DMVs显示元数据(译)
解剖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 有期望可以跟我联系,我会让你愿望成真!
第九篇完
解剖SQLSERVER 第九篇 OrcaMDF现在能通过系统DMVs显示元数据(译)的更多相关文章
- 解剖SQLSERVER 第一篇 数据库恢复软件商的黑幕(有删减版)
解剖SQLSERVER 第一篇 数据库恢复软件商的黑幕(有删减版) 这一系列,我们一起来解剖SQLSERVER 在系列的第一篇文章里本人可能会得罪某些人,但是作为一位SQLSERVER MVP,在我 ...
- 解剖SQLSERVER 第八篇 OrcaMDF 现在支持多数据文件的数据库(译)
解剖SQLSERVER 第八篇 OrcaMDF 现在支持多数据文件的数据库(译) http://improve.dk/orcamdf-now-supports-databases-with-mult ...
- 解剖SQLSERVER 第二篇 对数据页面头进行逆向(译)
解剖SQLSERVER 第二篇 对数据页面头进行逆向(译) http://improve.dk/reverse-engineering-sql-server-page-headers/ 在开发Orc ...
- 解剖SQLSERVER 完结篇 关于Internals Viewer源代码
解剖SQLSERVER 完结篇 关于Internals Viewer源代码 大家可能都用过Internals Viewer这个软件 <查看SQLSERVER内部数据页面的小插件Internals ...
- 解剖SQLSERVER 第十六篇 OrcaMDF RawDatabase --MDF文件的瑞士军刀(译)
解剖SQLSERVER 第十六篇 OrcaMDF RawDatabase --MDF文件的瑞士军刀(译) http://improve.dk/orcamdf-rawdatabase-a-swiss-a ...
- 解剖SQLSERVER 第十七篇 使用 OrcaMDF Corruptor 故意损坏数据库(译)
解剖SQLSERVER 第十七篇 使用 OrcaMDF Corruptor 故意损坏数据库(译) http://improve.dk/corrupting-databases-purpose-usin ...
- 解剖SQLSERVER 第十二篇 OrcaMDF 行压缩支持(译)
解剖SQLSERVER 第十二篇 OrcaMDF 行压缩支持(译) http://improve.dk/orcamdf-row-compression-support/ 在这两个月的断断续续的开发 ...
- 解剖SQLSERVER 第七篇 OrcaMDF 特性概述(译)
解剖SQLSERVER 第七篇 OrcaMDF 特性概述(译) http://improve.dk/orcamdf-feature-recap/ 时间过得真快,这已经过了大概四个月了自从我最初介绍我 ...
- 解剖SQLSERVER 第十篇 OrcaMDF Studio 发布+ 特性重温(译)
解剖SQLSERVER 第十篇 OrcaMDF Studio 发布+ 特性重温(译) http://improve.dk/orcamdf-studio-release-feature-recap/ ...
随机推荐
- 日期对象-Date
新建日期对象 var date = new Date(); getTime() 从 1970年 1月 1日开始计算到 Date 对象中的时间之间的毫秒数. getFullYear() ...
- 【java】:通用小知识
1.将String字符串放在最前面 为了防止偶发性的NullPointerException 异常,我们通常将String放置在equals()函数的左边来实现字符串比较,如下代码: // Bad i ...
- vuex2.0.0爬坑记录 -- mutations的第一个参数state不能解构
今天在学习vuex的过程中,遇到了一个很困扰人的问题,最终利用vuex的状态快照工具logger解决了问题. 问题是这样的,我在子组件中使用了mapState()函数来将状态映射至子组件中,使子组件能 ...
- TColor 与 RGB 的转换函数
function RGB2TColor(const R, G, B: Byte): Integer;begin // convert hexa-decimal values to RGB Resu ...
- Runloop 深入理解(转)
RunLoop 是 iOS 和 OSX 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,介绍 RunLoop 的概念以及底层实现原理.之后会介绍一下在 iOS 中,苹果是如何利 ...
- SharePoint 2013开发入门探索(一)- 自定义列表
在SharePoint 2013中创建自定义列表的方式有很多,在网站内容页面添加应用程序就可以创建(站点内容-〉 您的应用程序),也可以通过SharePoint Designer 2013创建,而本文 ...
- 解决php中json_decode的异常JSON_ERROR_CTRL_CHAR
该字符中含了ASCII码ETB控制符,即\x17导致json解析失败 (截图中显示ETB是因为用了Sublime text2) 解决方法如下:去掉0-31的控制符再进行decode $result = ...
- 安卓开发:DateUtils
public class DateUtils{ /** * 显示友好时间 * * @param ms * @return */ public static String getTimeDes(long ...
- 电子科技大学第八届ACM趣味程序设计竞赛第四场(正式赛)题解
A. Picking&Dancing 有一列n个石子,两人交替取石子,每次只能取连续的两个,取走后,剩下的石子仍然排成1列.问最后剩下的石子数量是奇数还是偶数. 读懂题意就没什么好说的. #i ...
- 我与solr(三)--solr后台相关介绍
1.DashBoard: 介绍了当前solr的相关信息,运行时间,版本信息,java虚拟机的配置信息. 注意我们的solr与lucence的版本号是保持一致的,而不同的lucence版本也需要对应的j ...