我今天在查看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
是什么使
sysfiles
,sysforeignkeys
,sysindexkeys
,sysmembers
,sysprotects
系统表“伪造”?换一种说法,“根据SQL Server在内部实现它们”是什么意思?这是否意味着它们仅在进程需要它时才创建,或者如果我调用SELECT * FROM sysfiles
之类的东西时才创建? 最佳答案
伪表是一种特殊的“内存中”结构,没有磁盘上的持久性。 SQL Server根据需要创建它。
最好的例子是sysprocesses。
恕我直言:关键是“在磁盘上的持久性”:
sysusers或sysxlogins(例如)分别是每个数据库/主数据库中的真实表,并且可以在备份/还原后保留下来
sysprocesses或sysfiles将无法继续进行备份/还原,因为没有任何内容可写入或读取到磁盘