一些非常重要的系统表
一些非常重要的系统表
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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
2013-10-20 like语句百分号前置会使用到索引吗?