我无法弄清楚这些系统表的存储位置,非常感谢您的帮助。
问问题
741 次
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 回答