zoukankan      html  css  js  c++  java
  • 解剖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 有期望可以跟我联系,我会让你愿望成真!

    第九篇完

  • 相关阅读:
    Android入门程序(ListView包括一个网络状态显示)
    shell
    android.os.NetworkOnMainThreadException
    apache虚拟主机名不区分大小写的解决办法
    QT制作全屏播放器以及出现的问题
    QT使用Q_OBJECT链接不通过的一种情况
    使用PHP返回需要登录验证的HTML页面
    怎么样得到Boost的options_description的描述字符串
    QT的QHttp无信号发出,窗口程序关闭时崩溃
    apache 配置https
  • 原文地址:https://www.cnblogs.com/lyhabc/p/4021061.html
Copyright © 2011-2022 走看看