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(例如)分别是每个数据库/主机中的实际表,在备份/恢复后仍然有效
- 系统进程或系统文件在备份/恢复后将无法生存,因为磁盘上没有可写入或读取的内容
使用master;选择OBJECTPROPERTY(OBJECT_ID('sysprocesss'),N'TableIsFake')
返回NULL
而不是1
?