top

一些非常重要的系统表

一些非常重要的系统表

复制代码
    internal BaseTableData(Database db)
        {
            this.db = db;
            scanner = new DataScanner(db);

            // These are the very core base tables that we'll need to dynamically construct the schema of any other
            // required tables. By aggresively parsing these, we can do lazy loading of the rest.
            parseSysallocunits();
            parseSysrowsets();
            parseSyscolpars();
            parseSysobjects();
            parseSysscalartypes();
            parseSysrscols();
            parseSyssingleobjrefs();
        }
复制代码
复制代码
using System.Collections.Generic;
using System.Linq;
using OrcaMDF.Core.Engine;
using OrcaMDF.Core.MetaData.BaseTables;
using OrcaMDF.Core.MetaData.Enumerations;

namespace OrcaMDF.Core.MetaData
{
    internal class BaseTableData
    {
        private readonly Database db;
        private readonly DataScanner scanner;

        // These are crucial base tables that are eagerly scanned on instantiation
        internal IList<sysallocunit> sysallocunits { get; private set; }
        internal IList<syscolpar> syscolpars { get; private set; }
        internal IList<sysschobj> sysschobjs { get; private set; }
        internal IList<sysscalartype> sysscalartypes { get; private set; }
        internal IList<sysrowset> sysrowsets { get; private set; }
        internal IList<sysrscol> sysrscols { get; private set; }
        internal IList<syssingleobjref> syssingleobjrefs { get; private set; }
        
        private IList<sysidxstat> _sysidxstats;
        internal IList<sysidxstat> sysidxstats
        {
            get { return _sysidxstats ?? (_sysidxstats = scanner.ScanTable<sysidxstat>("sysidxstats").ToList()); }
        }
        
        private IList<syspalvalue> _syspalvalues;
        internal IList<syspalvalue> syspalvalues
        {
            get { return _syspalvalues ?? (_syspalvalues = syspalvalue.GetServer2008R2HardcodedValues()); }
        }

        private IList<syspalname> _syspalnames;
        internal IList<syspalname> syspalnames
        {
            get { return _syspalnames ?? (_syspalnames = syspalname.GetServer2008R2HardcodedValues()); }
        }

        private IList<sysiscol> _sysiscols;
        internal IList<sysiscol> sysiscols
        {
            get { return _sysiscols ?? (_sysiscols = scanner.ScanTable<sysiscol>("sysiscols").ToList()); }
        }

        private IList<sysobjvalue> _sysobjvalues;
        internal IList<sysobjvalue> sysobjvalues
        {
            get { return _sysobjvalues ?? (_sysobjvalues = scanner.ScanTable<sysobjvalue>("sysobjvalues").ToList()); }
        }

        private IList<sysowner> _sysowners;
        internal IList<sysowner> sysowners
        {
            get { return _sysowners ?? (_sysowners = scanner.ScanTable<sysowner>("sysowners").ToList()); }
        }  

        internal BaseTableData(Database db)
        {
            this.db = db;
            scanner = new DataScanner(db);

            // These are the very core base tables that we'll need to dynamically construct the schema of any other
            // required tables. By aggresively parsing these, we can do lazy loading of the rest.
            parseSysallocunits();
            parseSysrowsets();
            parseSyscolpars();
            parseSysobjects();
            parseSysscalartypes();
            parseSysrscols();
            parseSyssingleobjrefs();
        }

        private void parseSyssingleobjrefs()
        {
            // Using a fixed object ID, we can look up the partition for sysscalartypes and scan the hobt AU from there
            long rowsetID = sysrowsets
                .Where(x => x.idmajor == (int)SystemObject.syssingleobjrefs && x.idminor == 1)
                .Single()
                .rowsetid;

            var pageLoc = new PagePointer(
                sysallocunits
                    .Where(x => x.auid == rowsetID && x.type == 1)
                    .Single()
                    .pgfirst
            );

            syssingleobjrefs = scanner.ScanLinkedDataPages<syssingleobjref>(pageLoc, CompressionContext.NoCompression).ToList();
        }

        private void parseSysrscols()
        {
            // Using a fixed object ID, we can look up the partition for sysscalartypes and scan the hobt AU from there
            long rowsetID = sysrowsets
                .Where(x => x.idmajor == (int)SystemObject.sysrscols && x.idminor == 1)
                .Single()
                .rowsetid;

            var pageLoc = new PagePointer(
                sysallocunits
                    .Where(x => x.auid == rowsetID && x.type == 1)
                    .Single()
                    .pgfirst
            );

            sysrscols = scanner.ScanLinkedDataPages<sysrscol>(pageLoc, CompressionContext.NoCompression).ToList();
        }

        private void parseSysscalartypes()
        {
            // Using a fixed object ID, we can look up the partition for sysscalartypes and scan the hobt AU from there
            long rowsetID = sysrowsets
                .Where(x => x.idmajor == (int)SystemObject.sysscalartypes && x.idminor == 1)
                .Single()
                .rowsetid;

            var pageLoc = new PagePointer(
                sysallocunits
                    .Where(x => x.auid == rowsetID && x.type == 1)
                    .Single()
                    .pgfirst
            );
            
            sysscalartypes = scanner.ScanLinkedDataPages<sysscalartype>(pageLoc, CompressionContext.NoCompression).ToList();
        }

        private void parseSysobjects()
        {
            // Using a fixed object ID, we can look up the partition for sysschobjs and scan the hobt AU from there
            long rowsetID = sysrowsets
                .Where(x => x.idmajor == (int)SystemObject.sysschobjs && x.idminor == 1)
                .Single()
                .rowsetid;

            var pageLoc = new PagePointer(
                sysallocunits
                    .Where(x => x.auid == rowsetID && x.type == 1)
                    .Single()
                    .pgfirst
            );

            sysschobjs = scanner.ScanLinkedDataPages<sysschobj>(pageLoc, CompressionContext.NoCompression).ToList();
        }

        private void parseSyscolpars()
        {
            // Using a fixed object ID, we can look up the partition for syscolpars and scan the hobt AU from there
            long rowsetID = sysrowsets
                .Where(x => x.idmajor == (int)SystemObject.syscolpars && x.idminor == 1)
                .Single()
                .rowsetid;

            var pageLoc = new PagePointer(
                sysallocunits
                    .Where(x => x.auid == rowsetID && x.type == 1)
                    .Single()
                    .pgfirst
            );

            syscolpars = scanner.ScanLinkedDataPages<syscolpar>(pageLoc, CompressionContext.NoCompression).ToList();
        }

        private void parseSysrowsets()
        {
            // Using a fixed allocation unit ID, we can look up the hobt AU and scan it
            var pageLoc = new PagePointer(
                sysallocunits
                    .Where(x => x.auid == FixedSystemObjectAllocationUnits.sysrowsets)
                    .Single()
                    .pgfirst
            );

            sysrowsets = scanner.ScanLinkedDataPages<sysrowset>(pageLoc, CompressionContext.NoCompression).ToList();
        }

        private void parseSysallocunits()
        {
            // Though this has a fixed first-page location at (1:16) we'll read it from the boot page to be sure
            var bootPage = db.GetBootPage();
            sysallocunits = scanner.ScanLinkedDataPages<sysallocunit>(bootPage.FirstSysIndexes, CompressionContext.NoCompression).ToList();
        }
    }
}
复制代码

rawdatabase 只需要4个系统表

SQL2012Sysallocunits
SQL2012Syscolpars
SQL2012Sysrowsets
SQL2012Sysschobjs

 

posted @   桦仔  阅读(960)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
历史上的今天:
2013-10-20 like语句百分号前置会使用到索引吗?
点击右上角即可分享
微信分享提示