0

我无法弄清楚这些系统表的存储位置,非常感谢您的帮助。

4

2 回答 2

3

这些是观点。

视图定义保存在隐藏资源数据库中,但它们访问保存在每个单独数据库中的系统基表。

您可以使用sp_helptext来查看sys.indexes(以及它访问sys.sysidxstats, sys.syssingleobjrefs, sys.syspalvalues)的定义,但尝试这样做sys.objects只会显示SELECT反对sys.objects$

但是,如果您查看 select 的执行计划,sys.objects则可以看到访问的对象。

  |--Hash Match(Right Outer Join, HASH:([n].[value])=([o].[type]), RESIDUAL:([mssqlsystemresource].[sys].[syspalnames].[value] as [n].[value]=[foo].[sys].[sysschobjs].[type] as [o].[type]))
       |--Clustered Index Seek(OBJECT:([mssqlsystemresource].[sys].[syspalnames].[cl] AS [n]), SEEK:([n].[class]='OBTY') ORDERED FORWARD)
       |--Hash Match(Right Outer Join, HASH:([r].[depid])=([o].[id]))
            |--Index Scan(OBJECT:([foo].[sys].[syssingleobjrefs].[nc1] AS [r]),  WHERE:([foo].[sys].[syssingleobjrefs].[class] as [r].[class]=(97) AND [foo].[sys].[syssingleobjrefs].[depsubid] as [r].[depsubid]=(0)))
            |--Filter(WHERE:(has_access('CO',[foo].[sys].[sysschobjs].[id] as [o].[id])=(1)))
                 |--Compute Scalar(DEFINE:([Expr1006]=CONVERT(bit,[foo].[sys].[sysschobjs].[status] as [o].[status]&(1),0), [Expr1009]=CONVERT(bit,[foo].[sys].[sysschobjs].[status] as [o].[status]&(16),0), [Expr1010]=CONVERT(bit,[foo].[sys].[sysschobjs].[status] as [o].[status]&(64),0)))
                      |--Clustered Index Scan(OBJECT:([foo].[sys].[sysschobjs].[clst] AS [o]), WHERE:([foo].[sys].[sysschobjs].[nsclass] as [o].[nsclass]=(0) AND [foo].[sys].[sysschobjs].[pclass] as [o].[pclass]=(1)))

但是除了通过 DAC 之外,不能直接查询系统基表,因此了解这些信息很少有用。

于 2019-03-12T06:50:45.803 回答
0

所有 sys 对象都存储在资源数据库中,并且在每个数据库的 sys 模式下逻辑可见。

例子 :

Select * from Database.sys.sysaltfiles尽管该视图不在该数据库中,但仍会为您提供结果。

于 2019-03-12T09:14:00.310 回答