哪个数据库在 SQL Server 中存储 sys.tables 或 sys.indexes?
Posted
技术标签:
【中文标题】哪个数据库在 SQL Server 中存储 sys.tables 或 sys.indexes?【英文标题】:Which database stores sys.tables or sys.indexes in SQL Server? 【发布时间】:2019-03-12 06:04:17 【问题描述】:我无法弄清楚这些系统表的存储位置,非常感谢您的帮助。
【问题讨论】:
这有关系吗?如果你弄清楚了,而供应商在下一个版本中更改了它的位置怎么办。 【参考方案1】:这些是视图。
视图定义保存在隐藏的resource database 中,但它们访问每个单独数据库中保存的system base tables。
您可以使用sp_helptext
来查看sys.indexes
的定义(并且它访问sys.sysidxstats
、sys.syssingleobjrefs
、sys.syspalvalues
)但尝试使用sys.objects
只会显示SELECT
与@987654330 @。
如果您查看针对 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 直接查询,因此这些信息很少有用。
【讨论】:
【参考方案2】:所有 sys 对象都存储在资源数据库中,并且在每个数据库的 sys 架构下逻辑可见。
例子:
Select * from Database.sys.sysaltfiles
将为您提供结果,尽管该视图不在该数据库中。
【讨论】:
您的回答并没有比 Martin 的回答有所改进。以上是关于哪个数据库在 SQL Server 中存储 sys.tables 或 sys.indexes?的主要内容,如果未能解决你的问题,请参考以下文章