首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >明白sys.objects、sys.system_objects和sys.sysobjects的意思吗?

明白sys.objects、sys.system_objects和sys.sysobjects的意思吗?
EN

Database Administration用户
提问于 2017-12-19 10:43:45
回答 2查看 17.6K关注 0票数 11

在这个问题上 -我正在使用sys.sysobjects编写一个查询。然而,其中一个答案提到了sys.system_objects。我只是想知道这些桌子有什么区别?

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

sysobjects还有更多的东西。

代码语言:javascript
复制
> 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
EN

回答 2

Database Administration用户

发布于 2017-12-19 10:53:04

正如我在上一篇文章中所指出的,sys.sysobjects是不可取的:

注意:从sys.sysobjects (Transact-SQL)中获取的这个Server 2000系统表是作为向后兼容性视图而包含的。建议您改用当前的Server系统视图。若要查找等效的系统视图,请参阅将系统表映射到系统视图(Transact-SQL)。此功能将在Microsoft Server的未来版本中删除。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。

现在您必须将sys.system_objectssys.objects组合起来,以检索存储在不推荐的sys.sysobjects系统表中的所有项。

代码语言:javascript
复制
SELECT * FROM sys.system_objects 
UNION ALL
SELECT * FROM sys.objects AS o

结果:

代码语言:javascript
复制
(2171 row(s) affected)
  • sys.system_objects包含Microsoft中包含的所有架构作用域系统对象的一行。所有系统对象都包含在名为sysINFORMATION_SCHEMA的架构中。
  • sys.objects包含在数据库中创建的每个用户定义的模式作用域对象的行,包括本机编译的标量用户定义函数。

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

代码语言:javascript
复制
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
票数 12
EN

Database Administration用户

发布于 2017-12-19 11:26:38

不同之处在于:

  • sys.sysobjects是一个旧的Server 2000系统表(兼容性视图)。从Server 2005开始,Microsoft引入了一组称为目录视图的新视图,作为兼容性视图的替代。为了实现向后兼容性,兼容视图仍在Server中(Microsoft决定保留旧视图以避免破坏某些内部代码)。
  • sys.system_objects是一个目录视图。您可以通过执行以下命令来检查对象定义:SELECT OBJECT_DEFINITION(OBJECT_ID('sys.system_objects'))

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

代码语言:javascript
复制
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 

sys.objects中提取,您可以找到sys.sysschobjs

代码语言:javascript
复制
SELECT name, type_desc FROM sys.objects
WHERE name = 'sysschobjs' 

下面的系统表需要DAC访问

代码语言:javascript
复制
+------------+--------------+
| name       | type_desc    |
+------------+--------------+
| sysschobjs | SYSTEM_TABLE |
+------------+--------------+

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

代码语言:javascript
复制
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

这里是微软文档

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

  • sys.databases ( Server 2005及以上)
  • sys.sysdatabases ( Server 2000)

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

票数 5
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/193505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档