Sql server 为什么某些系统表被确定为“a”;“假表”;使用;“表是假的”;对象属性?

Sql server 为什么某些系统表被确定为“a”;“假表”;使用;“表是假的”;对象属性?,sql-server,tsql,sql-server-2000,metadata,Sql Server,Tsql,Sql Server 2000,Metadata,我今天查看了ObjectProperty列表,发现属性TableIsFake。这个名字让我很开心,所以我看了看它检查了什么: 这张桌子不是真的。它由SQL Server按需在内部实现 这到底意味着什么?例如,当我运行以下查询时: SELECT [name], xtype FROM dbo.sysobjects WHERE OBJECTPROPERTY(object_id([name]), N'TableIsFake') = 1 ORDER BY [name] 我得到以下结果: name

我今天查看了
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 
我得到以下系统表:

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 

是什么使系统文件、
sysforeignkeys
sysindexkeys
sysmembers
sysprotects
系统表“假”呢?或者换句话说,它们“由SQL Server按需在内部实现”意味着什么?这是否意味着它们仅在流程需要时创建,或者如果我调用类似于
SELECT*fromsysfiles

的东西,那么sysfiles表实际上是一个视图,并且是为了向后兼容而创建的 看看你应该用什么

因此,您应该使用sys.database_files,而不是sysfiles。伪表是一种特殊的“内存”结构,没有磁盘持久性。SQL Server按需创建它

最好的例子是sysprocesss

IMHO:关键是“磁盘上持久性”:

  • sysusers或SYSXLOGIN(例如)分别是每个数据库/主机中的实际表,在备份/恢复后仍然有效
  • 系统进程或系统文件在备份/恢复后将无法生存,因为磁盘上没有可写入或读取的内容

我忘了提到我正在SQL Server 2000中测试这一点。编辑了我的问题标签。有道理,但你知道为什么
使用master;选择OBJECTPROPERTY(OBJECT_ID('sysprocesss'),N'TableIsFake')
返回
NULL
而不是
1