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_objects
并sys.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)
包含一行用于 Microsoft SQL Server 中包含的所有架构范围系统对象。所有系统对象都包含在名为
sys
或的模式中INFORMATION_SCHEMA
。
为在数据库中创建的每个用户定义的、架构范围的对象包含一行,包括本机编译的用户定义的标量函数
例如sp_MScleanupmergepublisher
isì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)
+------------+--------------+
| 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 的未来版本中删除它。
首先,微软提供了与此讨论相关的三个类别,
SYSTEM TABLE
或目录表。这些需要 DAC 来直接访问。INFORMATION_SCHEMA
可以被认为是 ISO 标准化系统目录视图。sys.sysschobjs
、SYSTEM 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)
(尚未确定后果)type
、userstat
、 和systat
都添加在这里,兼容性视图调用的内容category
非常奇怪,可能在其他地方没有使用。xtype
是来自的纯粹类型sys.sysschobjs$
我相信sch
insysschobjs
代表模式。这是另一个反助记符,忘记它吧,因为它存储的东西不在sys
模式中。为此,您需要sys.system_objects
.