兼容性视图 (Transact-SQL)

SQL Server 早期版本中的许多系统表现在都作为一组视图实现。 这些视图称为兼容性视图,仅用于向后兼容。 兼容性视图公开的元数据在 SQL Server 2000 中也提供。 但是,兼容性视图不公开与在 SQL Server 2005 及更高版本中引入的功能有关的任何元数据。 因此,当您使用新功能(例如 Service Broker 或分区)时,必须切换到使用目录视图。

升级到目录视图的另一个原因是,存储用户 ID 和类型 ID 的兼容性视图列可能返回 NULL 或触发算术溢出。 这是因为您可以创建超过 32,767 个用户、组和角色,以及超过 32,767 种数据类型。 例如,如果要创建 32,768 个用户,然后运行以下查询:SELECT * FROM sys.sysusers。 如果 ARITHABORT 设置为 ON,则查询会失败,并出现算术溢出错误。 如果 ARITHABORT 设置为 OFF,则 uid 列返回 NULL。

若要避免这些问题,建议您使用新增的目录视图,这些视图可以处理增加的用户 ID 和类型 ID 数目。 下表列出了会出现此溢出的列。

列名

兼容性视图

SQL Server 2005 视图

xusertype

syscolumns

sys.columns

usertype

syscolumns

sys.columns

memberuid

sysmembers

sys.database_role_members

groupuid

sysmembers

sys.database_role_members

uid

sysobjects

sys.objects

uid

sysprotects

  • sys.database_permissions

  • sys.server_permissions

grantor

sysprotects

  • sys.database_permissions

  • sys.server_permissions

xusertype

systypes

sys.types

uid

systypes

sys.types

uid

sysusers

sys.database_principals

altuid

sysusers

sys.database_principals

gid

sysusers

sys.database_principals

uid

syscacheobjects

sys.dm_exec_plan_attributes

uid

sysprocesses

sys.dm_exec_requests

在用户数据库中进行引用时,在 SQL Server 2000 中宣布不推荐使用的系统表(如 syslanguages 或 syscacheobjects)现在绑定到 sys 架构中的向后兼容性视图。 由于多个版本已不推荐使用 SQL Server 2000 系统表,因此此更改不被认为是一个重大更改。

示例:如果一个用户在一个用户数据库中创建了名为 syslanguages 的用户表,在 SQL Server 2008 中,该数据库中的语句 SELECT * from dbo.syslanguages; 将返回用户表中的值。 从 SQL Server 2012 开始,此操作将返回系统视图 sys.syslanguages 中的数据。

请参阅

参考

目录视图 (Transact-SQL)

将系统表映射到系统视图 (Transact-SQL)