系统基表

适用于:SQL ServerAzure SQL 托管实例

系统基表是基础表,用于实际存储特定数据库的元数据。 master 数据库在这方面很特别,因为它包含其他任何数据库中未找到的一些附加表。 这些表包含服务器范围内的持久化元数据。

重要

系统基表仅在 SQL Server 数据库引擎中使用,不适用于常规客户使用。 随时可能对其进行更改,不保证兼容性。

系统基表元数据

对数据库具有 CONTROL、ALTER 或 VIEW DEFINITION 权限的被授权者可以在 sys.objects 目录视图中查看系统基表元数据。 被授权者还可以通过使用内置函数(如OBJECT_NAME和OBJECT_ID)解析系统基表的名称和对象 ID。

若要绑定到系统基表,用户必须使用专用管理员连接(DAC)连接到 SQL Server 实例。 如果在没有使用 DAC 进行连接的情况下尝试从系统基表执行 SELECT 查询,则会引发错误。

重要

使用 DAC 访问系统基表仅适用于 Microsoft 人员,并且不是受支持的客户方案。

系统基表

下表列出了并描述了 SQL Server 中的每个系统基表。

基表 说明
sys.sysschobjs 存在于每个数据库中。 每一行表示数据库中的一个对象。
sys.sysbinobjs 存在于每个数据库中。 数据库中的每个 Service Broker 实体都存在对应的一行。 Service Broker 实体包括以下内容:

消息类型

服务协定

服务

名称和类型使用固定的二进制排序规则。
sys.sysclsobjs 存在于每个数据库中。 共享相同通用属性的每个分类实体均存在对应的一行,这些属性包括以下内容:

Assembly

备份设备

全文目录

分区函数

分区方案

文件组

模糊处理键

架构
sys.sysnsobjs 存在于每个数据库中。 每个命名空间范围内的实体均存在对应的一行。 此表用于存储 XML 集合实体。
sys.syscolpars 存在于每个数据库中。 表、视图或表值函数的每个列均存在对应的一行。 过程或函数的每个参数也存在对应的行。
sys.systypedsubobjs 存在于每个数据库中。 每个类型化的子实体均存在对应的一行。 只有分区函数的参数属于此类别。
sys.sysidxstats 存在于每个数据库中。 表和索引视图的每个索引或统计信息均存在对应的一行

注意:每个索引(堆除外)都与与索引同名的统计信息相关联。
sys.sysiscols 存在于每个数据库中。 每个持久化索引和统计信息列均存在对应的一行。
sys.sysscalartypes 存在于每个数据库中。 每个用户定义类型或系统类型均存在对应的一行。
sys.sysdbreg 仅在 master 数据库中存在。 每个注册数据库均存在对应的一行。
sys.sysxsrvs 仅在 master 数据库中存在。 每个本地服务器、链接服务器或远程服务器均存在对应的一行。
sys.sysrmtlgns 此系统基表仅存在于 master 数据库中。 每个远程登录映射均存在对应的一行。 这用于将声明来自对应服务器的传入登录映射到实际本地登录。
sys.syslnklgns 仅在 master 数据库中存在。 每个链接登录映射均存在对应的一行。 链接登录映射由远程过程调用和分布式查询使用,从本地服务器发出到对应的链接服务器。
sys.sysxlgns 仅在 master 数据库中存在。 每个服务器主体均存在对应的一行。
sys.sysdbfiles 存在于每个数据库中。 如果列 dbid 为零,则行表示属于此数据库的文件。 在 master 数据库中,列 dbid 可以是非零。 如果是这样,该行表示主文件。
sys.sysusermsg 仅在 master 数据库中存在。 每一行表示用户定义的错误消息。
sys.sysprivs 存在于每个数据库中。 每个数据库或服务器级权限均存在对应的一行。

注意:服务器级权限存储在 master 数据库中。
sys.sysowners 存在于每个数据库中。 每一行表示一个数据库主体。
sys.sysobjkeycrypts 存在于每个数据库中。 每个与对象关联的对称密钥、加密或加密属性均存在对应的一行。
sys.syscerts 存在于每个数据库中。 数据库中的每个证书均存在对应的一行。
sys.sysasymkeys 存在于每个数据库中。 每一行表示一个非对称密钥。
sys.ftinds 存在于每个数据库中。 数据库中的每个全文索引均存在对应的一行。
sys.sysxprops 存在于每个数据库中。 每个扩展属性均存在对应的一行。
sys.sysallocunits 存在于每个数据库中。 每个存储分配单元均存在对应的一行。
sys.sysrowsets 存在于每个数据库中。 索引或堆的每个分区行集均存在对应的一行。
sys.sysrowsetrefs 存在于每个数据库中。 行集引用的每个索引均存在对应的一行。
sys.syslogshippers 仅在 master 数据库中存在。 每个数据库镜像见证服务器均存在对应的一行。
sys.sysremsvcbinds 存在于每个数据库中。 每个远程服务绑定均存在对应的一行。
sys.sysconvgroup 存在于每个数据库中。 Service Broker 中的每个服务实例均存在对应的一行。
sys.sysxmitqueue 存在于每个数据库中。 每个 Service Broker 传输队列均存在对应的一行。
sys.sysdesend 存在于每个数据库中。 Service Broker 会话的每个发送端点均存在对应的一行。
sys.sysdercv 存在于每个数据库中。 Service Broker 会话的每个接收端点均存在对应的一行。
sys.sysendpts 仅在 master 数据库中存在。 服务器中创建的每个端点均存在对应的一行。
sys.syswebmethods 仅在 master 数据库中存在。 对服务器中创建的启用 SOAP 的 HTTP 端点定义的每个 SOAP 方法均存在对应的一行。
sys.sysqnames 存在于每个数据库中。 4 字节 ID 标记的每个命名空间或限定名均存在对应的一行。
sys.sysxmlcomponent 存在于每个数据库中。 每一行表示一个 XML 架构组件。
sys.sysxmlfacet 存在于每个数据库中。 具有 XML 类型定义的每个 XML 方面(限制)均存在对应的一行。
sys.sysxmlplacement 存在于每个数据库中。 XML 组件的每个 XML 位置均存在对应的一行。
sys.syssingleobjrefs 存在于每个数据库中。 每个常规 N 到 1 引用均存在对应的一行。
sys.sysmultiobjrefs 存在于每个数据库中。 每个常规 N 到 N 引用均存在对应的一行。
sys.sysobjvalues 存在于每个数据库中。 实体的每个常规值属性均存在对应的一行。
sys.sysguidrefs 存在于每个数据库中。 每个 GUID 分类 ID 引用均存在对应的一行。

更新系统基表

可通过系统目录视图查看系统表中的数据。 若要更新系统基表中的元数据,请使用相应的 Transact-SQL 接口(例如 DDL 语句)。 无法手动更新系统表。 SQL Server 在对系统表执行直接更新时报告以下消息。

手动更新系统表

Msg 17659:警告:系统表 ID ID 已在>数据库 ID <<ID 中>直接更新,缓存一致性可能尚未维护。 应重新启动 SQL Server。

使用手动更新的系统表启动数据库

Msg 3859:警告:系统目录在数据库 ID 17 中直接更新,最近date_time。

手动更新系统表后执行 DBCC_CHECKDB 命令

Msg 3859:警告:系统目录在数据库 ID 17 中直接更新,最近date_time。

如果对系统表执行手动更新并遇到问题,系统可能会要求从备份还原或将数据从受影响的数据库复制到新数据库。 详细了解 用户操作错误消息