理解 sys.objects、sys.system_objects 和 sys.sysobjects?

Eva*_*oll 9 sql-server database-internals system-tables

在这个问题中,我正在使用sys.sysobjects. 但是,提到的答案之一sys.system_objects。我只是想知道这些表之间有什么区别?

  • sys.objects
  • sys.system_objects
  • sys.sysobjects

sysobjects 有更多的东西。

> SELECT count(*) FROM sysobjects;
2312

> SELECT count(*) FROM sys.system_objects;
2201

> SELECT count(*) FROM sys.objects;
> 111

SELECT count(*)
FROM sys.sysobjects
WHERE NOT EXISTS (
  SELECT 1
  FROM sys.system_objects
  WHERE system_objects.object_id = sysobjects.id
);
> 111
Run Code Online (Sandbox Code Playgroud)

Joh*_* N. 11

如我之前的帖子所述,sys.sysobjects已弃用:

取自sys.sysobjects(的Transact-SQL)

此 SQL Server 2000 系统表作为向后兼容性视图包含在内。我们建议您改用当前的 SQL Server 系统视图。要查找等效的系统视图或视图,请参阅将系统表映射到系统视图 (Transact-SQL)。此功能将在 Microsoft SQL Server 的未来版本中删除。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。

您现在必须合并sys.system_objectssys.objects检索存储在已弃用sys.sysobjects系统表中的所有项目。

SELECT * FROM sys.system_objects 
UNION ALL
SELECT * FROM sys.objects AS o
Run Code Online (Sandbox Code Playgroud)

结果:

(2171 row(s) affected)
Run Code Online (Sandbox Code Playgroud)
  • sys.system_objects

    包含一行用于 Microsoft SQL Server 中包含的所有架构范围系统对象。所有系统对象都包含在名为sys或的模式中INFORMATION_SCHEMA

  • sys.objects

    为在数据库中创建的每个用户定义的、架构范围的对象包含一行,包括本机编译的用户定义的标量函数

例如sp_MScleanupmergepublisherisìs_ms_shipped但不在sys模式中(它在 中dbo)所以它在sys.objects而不是sys.system_objects。这可能是因为它是一个 shell,sys.sp_MScleanupmergepublisher_internal并且可能是在实例创建时定义的。如果您有 SSMS 右键单击dbo.sp_MScleanupmergepublisher系统存储过程,然后选择修改

USE [master]
GO
/****** Object:  StoredProcedure [dbo].[sp_MScleanupmergepublisher]    Script Date: 19.12.2017 12:12:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO
ALTER procedure [dbo].[sp_MScleanupmergepublisher]
as
    exec sys.sp_MScleanupmergepublisher_internal
Run Code Online (Sandbox Code Playgroud)


小智 5

这是区别:

  • sys.sysobjects是一个旧的 SQL Server 2000 系统表(兼容性视图)。从 SQL Server 2005 开始,Microsoft 引入了一组称为目录视图的新视图,以替代兼容性视图。为了向后兼容,兼容性视图仍在 SQL Server 中(Microsoft 决定保留旧视图以不破坏某些内部代码)。

  • sys.system_objects是目录视图。您可以通过执行以下命令来检查对象定义:SELECT OBJECT_DEFINITION(OBJECT_ID('sys.system_objects'))

在目录视图中,您可以看到他们正在使用系统表sys.sysschobjs

CREATE VIEW sys.system_objects 
AS   
SELECT o.name,    
o.id AS object_id,    
convert(int, null) AS principal_id,    
o.nsid AS schema_id,    convert(int, 0) AS parent_object_id,    
o.type,    
n.name AS type_desc,    
o.created AS create_date,    
o.modified AS modify_date,    
convert(bit, 1) AS is_ms_shipped,    
convert(bit, 0) AS is_published,    
convert(bit, 0) AS is_schema_published   
FROM sys.sysschobjs o   
LEFT JOIN sys.syspalnames n ON n.class = 'OBTY' AND n.value = o.type   WHERE has_access('SO', o.id) = 1 
Run Code Online (Sandbox Code Playgroud)

从中提取sys.objects可以找到sys.sysschobjs

SELECT name, type_desc FROM sys.objects
WHERE name = 'sysschobjs' 
Run Code Online (Sandbox Code Playgroud)

下面的系统表需要DAC访问

+------------+--------------+
| name       | type_desc    |
+------------+--------------+
| sysschobjs | SYSTEM_TABLE |
+------------+--------------+
Run Code Online (Sandbox Code Playgroud)

您可以通过执行以下命令找到目录视图:

SELECT * 
FROM sys.all_views
WHERE [schema_id] = 4 AND [name] NOT LIKE 'dm%' AND [object_id] NOT IN (-212,-211,-210,-209,-208,-207,-206,-205,-204,-203,-202,-201,-200,-199,-198,-197,-196,-195,-194,-193,-192,-143,-142,-141,-140,-139,-138,-137,-136,-135,-134,-133,-132,-131,-130,-129,-106,-105)
ORDER BY [name] ASC
Run Code Online (Sandbox Code Playgroud)

微软文档在这里

您可以查看其他系统表并进行比较:

  • sys.databases (SQL Server 2005 及更高版本)
  • sys.sysdatabases (SQL Server 2000)

Microsoft 不鼓励我们使用旧的系统表。旧的兼容性视图没有与更高版本的 SQL Server 功能(例如分区等)相关的新元数据。仅在 SQL Server 2000 上使用它,因为 Microsoft 将从 SQL Server 的未来版本中删除它。


Eva*_*oll 3

微软用语

首先,微软提供了与此讨论相关的三个类别,

  • 存储“系统对象”的系统基表SYSTEM TABLE目录表。这些需要 DAC 来直接访问。
  • 系统目录视图在 Microsoft 词典中具有许多命名子类别,唯一与此讨论相关的是对象目录视图INFORMATION_SCHEMA可以被认为是 ISO 标准化系统目录视图。
  • 兼容性视图,严格来说是一个遗留层,其使用已被明确弃用。

应用

  • sys.sysschobjsSYSTEM TABLE、 SQL Server 中的所有对象都在此系统表中表示。该系统表有自己的视图,称为“视图”,sys.sysschobjs$它获取内部位字符串并将它们扩展为bit列。sys.sysschobjs$从连接中拉出的两个目录视图sys.syspalnames ON syspalnames.class = 'OBTY'是,

    • sys.system_objects, OBJECT CATALOG VIEW. 由 Microsoft 颁布,指定为系统,并通过将其安装到sys架构中来标识。他们在用语中得到了明确的“系统”限定词。在内部这是has_access('CO', o.id)

    • sys.objects, OBJECT CATALOG VIEW. 所有其他对象都是非系统对象,这是隐式的。当您看到objects(与系统对象并列)时,请考虑非系统对象。在内部这是has_access('SO', o.id)

  • sys.sysobjects,兼容性视图。具有欺骗性的命名是因为sys当视图本身引入非系统对象时,这里的指定很尴尬。我怀疑系统对象和非系统对象之间曾经没有指定,它们都是sysobjects. 现在指定已经存在,这已成为“兼容性视图”。尽管其他答案暗示这是UNION ALL严格意义上不正确的。

    • 它直接查询sys.sysschobjs并提供其他目录视图已删除的一些信息,例如uid.
    • 在内部这是has_access('MO', id)(尚未确定后果)
    • typeuserstat、 和systat都添加在这里,兼容性视图调用的内容category非常奇怪,可能在其他地方没有使用。xtype是来自的纯粹类型sys.sysschobjs$

脚注

我相信schinsysschobjs代表模式。这是另一个反助记符,忘记它吧,因为它存储的东西不在sys模式中。为此,您需要sys.system_objects.