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
oINFORMATION_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 sys
esquema (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 llamadasys.sysschobjs$
que toma las cadenas de bits internas y las expande enbit
columnas. Dos vistas de catálogo que se basan ensys.sysschobjs$
unirse contrasys.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 elsys
esquema. Obtienen un calificador explícito de “Sistema” en el lenguaje. Internamente esto eshas_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 veasobjects
(yuxtapuesto con Objetos del Sistema), piense en Objetos que no son del Sistema. Internamente esto eshas_access('SO', o.id)
-
-
sys.sysobjects
, Vista de compatibilidad. Engañosamente nombrado porque elsys
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 fueronsysobjects
. Ahora que la designación está ahí, esto se ha convertido en una “Vista de compatibilidad”. Aunque otras respuestas implican que esta es unaUNION ALL
eso es estrictamente hablando incorrecto.- Consulta
sys.sysschobjs
directamente y proporciona información que las otras vistas del catálogo han eliminado, comouid
. - Internamente esto es
has_access('MO', id)
(aún no estoy seguro de las ramificaciones) type
,userstat
, ysystat
se agregan aquí, y lo que la Vista de compatibilidad llamacategory
es sumamente extraño y posiblemente no se use en ningún otro lugar.xtype
es el tipo no adulterado desys.sysschobjs$
- Consulta
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.