我今天在查看ObjectProperty列表,遇到了属性TableIsFake。这个名字使我感到很有趣,所以我看了看一下:


该表不是真实的。它是根据SQL Server在内部实现的。


这到底是什么意思?例如,当我运行以下查询时:

SELECT [name], xtype
FROM dbo.sysobjects
WHERE OBJECTPROPERTY(object_id([name]), N'TableIsFake') = 1
ORDER BY [name]


我得到以下结果:

name           xtype
-------------- -----
sysfiles       S
sysforeignkeys S
sysindexkeys   S
sysmembers     S
sysprotects    S


但是,如果我在数据库中查询系统表:

SELECT [name], xtype
FROM dbo.sysobjects
WHERE xtype = 'S'
ORDER BY [name]


我得到以下系统表:

name                xtype
------------------- -----
syscolumns          S
syscomments         S
sysdepends          S
sysfilegroups       S
sysfiles            S
sysfiles1           S
sysforeignkeys      S
sysfulltextcatalogs S
sysfulltextnotify   S
sysindexes          S
sysindexkeys        S
sysmembers          S
sysobjects          S
syspermissions      S
sysproperties       S
sysprotects         S
sysreferences       S
systypes            S
sysusers            S


是什么使sysfilessysforeignkeyssysindexkeyssysmemberssysprotects系统表“伪造”?换一种说法,“根据SQL Server在内部实现它们”是什么意思?这是否意味着它们仅在进程需要它时才创建,或者如果我调用SELECT * FROM sysfiles之类的东西时才创建?

最佳答案

伪表是一种特殊的“内存中”结构,没有磁盘上的持久性。 SQL Server根据需要创建它。

最好的例子是sysprocesses。

恕我直言:关键是“在磁盘上的持久性”:


sysusers或sysxlogins(例如)分别是每个数据库/主数据库中的真实表,并且可以在备份/还原后保留下来
sysprocesses或sysfiles将无法继续进行备份/还原,因为没有任何内容可写入或读取到磁盘

10-08 07:57