Saltar al contenido

¿Entendiendo sys.objects, sys.system_objects y sys.sysobjects?

Solución:

Como se señaló en mi publicación anterior sys.sysobjects es obsoleto:

Nota tomado de sys.sysobjects (Transact-SQL)

Esta tabla del sistema de SQL Server 2000 se incluye como una vista para compatibilidad con versiones anteriores. En su lugar, le recomendamos que utilice las vistas actuales del sistema de SQL Server. Para encontrar la vista o vistas del sistema equivalentes, consulte Asignación de tablas del sistema a vistas del sistema (Transact-SQL). Esta función se eliminará en una versión futura de Microsoft SQL Server. Evite el uso de esta función en nuevos trabajos de desarrollo y planee modificar las aplicaciones que actualmente utilizan esta función.

Ahora tendrías que combinar sys.system_objects y sys.objects para recuperar todos los elementos que se almacenan en el obsoleto sys.sysobjects tabla del sistema.

SELECT * FROM sys.system_objects 
UNION ALL
SELECT * FROM sys.objects AS o

Resultado:

(2171 row(s) affected)
  • sys.system_objects

    Contiene una fila para todos los objetos del sistema con ámbito de esquema que se incluyen con Microsoft SQL Server. Todos los objetos del sistema están contenidos en los esquemas denominados sys o INFORMATION_SCHEMA.

  • sys.objects

    Contiene una fila para cada objeto definido por el usuario con alcance de esquema que se crea dentro de una base de datos, incluida la función escalar definida por el usuario compilada de forma nativa

Por ejemplo sp_MScleanupmergepublisher es ìs_ms_shipped pero no en el sysesquema (está en dbo) así que está en sys.objects y no sys.system_objects. Esto posiblemente se deba a que es un caparazón para sys.sp_MScleanupmergepublisher_internal y probablemente se define en la creación de la instancia. Si tiene SSMS, haga clic con el botón derecho en el dbo.sp_MScleanupmergepublisher procedimiento almacenado del sistema y luego seleccione Modificar:

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

Esta es la diferencia:

  • sys.sysobjects es una antigua tabla del sistema SQL Server 2000 (vista de compatibilidad). A partir de SQL Server 2005, Microsoft introdujo un nuevo conjunto de vistas llamadas vistas de catálogo como reemplazo de las vistas de compatibilidad. Las vistas de compatibilidad todavía están en SQL Server para compatibilidad con versiones anteriores (Microsoft decidió dejar las vistas antiguas para no romper algunos códigos internos).

  • sys.system_objects es una vista de catálogo. Puede verificar la definición del objeto ejecutando esto: SELECT OBJECT_DEFINITION(OBJECT_ID('sys.system_objects'))

Dentro de la vista del catálogo, puede ver que están usando la tabla del sistema. 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 

Extrayendo de sys.objects puedes encontrar el sys.sysschobjs

SELECT name, type_desc FROM sys.objects
WHERE name = 'sysschobjs' 

La siguiente tabla del sistema necesita DAC para acceder

+------------+--------------+
| name       | type_desc    |
+------------+--------------+
| sysschobjs | SYSTEM_TABLE |
+------------+--------------+

Puede encontrar las vistas del catálogo ejecutando:

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

Y Microsoft docs aquí

puede consultar otras tablas del sistema y comparar como:

  • sys.databases (SQL Server 2005 y posteriores)
  • sys.sysdatabases (SQL Server 2000)

Microsoft no nos anima a utilizar las tablas del sistema antiguo. Las vistas de compatibilidad antiguas no tienen los nuevos metadatos relacionados con la versión superior de las funciones de SQL Server (por ejemplo, particionamiento, etc.). Úselo únicamente en SQL Server 2000, ya que Microsoft lo eliminará de una versión futura de SQL Server.

Microsoft Parlance

Para comenzar, Microsoft tiene tres categorías relevantes para esta discusión,

  • Tablas de base del sistema, SYSTEM TABLE, o Tablas de catálogo que almacenan “Objetos del sistema”. Estos requieren DAC para acceso directo.
  • Vistas del catálogo del sistema que tiene numerosas subcategorías con nombre en la dicción de Microsoft, la única relevante para esta discusión es Vistas del catálogo de objetos. INFORMATION_SCHEMA se puede considerar como la Vista del catálogo del sistema estandarizada ISO.
  • Vistas de compatibilidad, estrictamente hablando, una capa heredada cuyo uso está explícitamente en desuso.

Solicitud

  • sys.sysschobjs, SYSTEM TABLE, todos los objetos de SQL Server están representados en esta tabla del sistema. Esta tabla del sistema tiene su propia vista llamada sys.sysschobjs$ que toma las cadenas de bits internas y las expande en bit columnas. Dos vistas de catálogo que se basan en sys.sysschobjs$ unirse contra sys.syspalnames ON syspalnames.class = 'OBTY' están,

    • sys.system_objects, OBJECT CATALOG VIEW. Decretado por Microsoft, designado como Sistema e identificado por su instalación en el sys esquema. Obtienen un calificador explícito de “Sistema” en el lenguaje. Internamente esto es has_access('CO', o.id)

    • sys.objects, OBJECT CATALOG VIEW. Todos los demás objetos son objetos que no son del sistema, lo cual está implícito. Cuando veas objects (yuxtapuesto con Objetos del Sistema), piense en Objetos que no son del Sistema. Internamente esto es has_access('SO', o.id)

  • sys.sysobjects, Vista de compatibilidad. Engañosamente nombrado porque el sys La designación aquí es incómoda cuando la propia vista extrae objetos que no son del sistema. Sospecho que en un momento no hubo designación entre el sistema y los objetos que no son del sistema y todos fueron sysobjects. Ahora que la designación está ahí, esto se ha convertido en una “Vista de compatibilidad”. Aunque otras respuestas implican que esta es una UNION ALL eso es estrictamente hablando incorrecto.

    • Consulta sys.sysschobjs directamente y proporciona información que las otras vistas del catálogo han eliminado, como uid.
    • Internamente esto es has_access('MO', id) (aún no estoy seguro de las ramificaciones)
    • type, userstat, y systat se agregan aquí, y lo que la Vista de compatibilidad llama category es sumamente extraño y posiblemente no se use en ningún otro lugar. xtype es el tipo no adulterado de sys.sysschobjs$

Notas al pie

Creo que el sch en sysschobjs significa esquema. Ese es otro anti-mnemónico, olvídalo porque almacena cosas que no están en el sys esquema. Para eso necesitas sys.system_objects.

Comentarios y valoraciones

Si guardas alguna incertidumbre o disposición de limar nuestro tutorial te proponemos realizar una aclaración y con placer lo estudiaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *