¿información de esquema de esquema de información poco confiable en SQL Server?

La documentación de SQL Server aquí dice que el table_schema campo de information_schema.tables es "poco confiable" y que la forma correcta de obtener el esquema de un objeto es consultar sys.objects.

¿Alguien puede dar más detalles? cómo y cuando el esquema informado por information_schema.tables puede ser incorrecto?

preguntado el 27 de agosto de 11 a las 22:08

Mirando la salida de EXEC sp_helptext 'INFORMATION_SCHEMA.TABLES' este utilizado sys.objects por lo que parece extraño. -

En SQL Server 2000, técnicamente, esta columna informaba al propietario del objeto, no a su esquema, aunque en 2000 ese concepto era intercambiable de todos modos. A menos que la portabilidad cruzada de RDBMS sea una prioridad máxima, recomiendo encarecidamente utilizar el sys vistas de catálogo para metadatos en lugar de INFORMATION_SCHEMA principalmente porque el primero se ampliará para nuevas funciones, pero el segundo estará relativamente estancado. (Como ejemplo, intente averiguar sobre índices filtrados usando INFORMATION_SCHEMA.) -

@Martin, ¿te diste cuenta de que realiza un LEFT JOIN? Me parece que eso indica que hay algún escenario en el que el esquema podría no ser válido (no puedo imaginarlo en la parte superior de mi cabeza). Pero el mensaje de advertencia (gramática incorrecta y todo) tiene poco sentido, porque significa que la fila en sys.schemas que sys.objects apunta también no es válido, entonces, ¿cómo se usa sys.objects (o el más apropiado sys.tables) darle algo más confiable que INFORMATION_SCHEMA? -

@Aaron: si la base de datos se ha actualizado desde SQL Server 2000 y se ha utilizado alguna de las nuevas declaraciones DDL, la información del esquema en sys.sysobjects puede estar mal Como se describe aquí. ¿Quizás simplemente pusieron la advertencia en demasiadas cosas? -

@todos, gracias por los comentarios. -

1 Respuestas

Es una pena que esto no haya sido respondido y solo se haya comentado tan parcialmente por codicia de reputación y, lo que es más importante, para sacarlo de la cola sin respuesta, agregaré algunos puntos a una respuesta.

  1. La redacción de la documentación no es precisa y está en proceso de corrección (ver Conectar # 686118). No estoy seguro de si corregirán los documentos de 2005, 2008 y 2008 R2 a la vez, o si las versiones anteriores se actualizarán. El punto es que no puedo imaginar un caso en el que el esquema en cualquiera de las vistas sea incorrecto, pero aún más, ese info_schema es incorrecto mientras sys.objects es correcto. Esto último es imposible: la vista info_schema se basa completamente en el sys.objects ver (solo mira SELECT OBJECT_DEFINITION (OBJECT_ID ('INFORMATION_SCHEMA.TABLES'));), por lo que si uno es incorrecto, ambos son incorrectos. Probablemente haya casos oscuros en los que ambos pueden ser incorrectos, pero no en las versiones actuales (por ejemplo, en SQL Server 2000, con la opción de configuración allow updates habilitado, eliminar de sysusers a un usuario que posee un objeto; no es realmente relevante o posible hoy, y no es algo que esté dispuesto a probar, pero es el único que puedo imaginar que habría motivado la redacción actual en cualquier momento).

  2. En general, los INFORMATION_SCHEMA las vistas deben evitarse en favor de las vistas de catálogo introducidas en SQL Server 2005 (y aumentadas desde entonces). ¿Por qué? Porque las vistas de catálogo continúan desarrollándose a medida que se agregan nuevas características a SQL Server, mientras que las vistas info_schema no. Como mencioné en mi comentario, intente encontrar información sobre índices filtrados en info_schema. Lo mismo ocurre con las columnas incluidas, los índices XML, las columnas de identidad / calculadas, las claves externas contra los índices únicos; todos estos elementos faltan por completo o están representados de manera diferente en las vistas de info_schema. En Denali agregaron una vista info_schema para Secuencias, pero nuevamente esto cumple con el mínimo del estándar y no incluye ninguna información sobre los detalles de implementación específicos de SQL Server (por ejemplo, si está agotado y si agregan nuevas características en el futuro, puede estar seguro de que la vista info_schema no se mantendrá en el bucle). El único caso en el que se apegaría a las vistas de info_schema es si (a) está escribiendo rutinas de metadatos que deben funcionar en plataformas compatibles con info_schema Y (b) no está utilizando ninguna característica específica de la plataforma que se perderá. Aparte de las herramientas de proveedores multiplataforma, este es probablemente un escenario bastante raro (e incluso en ese caso puede llevar a clientes descontentos que son utilizando esas funciones y la herramienta no las recogió).

  3. Presenté una sugerencia de Connect por separado (Conectar # 686121) que colocan una advertencia sobre esta incompletitud en todos INFORMATION_SCHEMA ver temas en Libros en línea. No creo que se sepa muy bien que son no la forma preferida de sacar metadatos de SQL Server, y quién podría culpar a la gente por no ver esto; después de todo, siempre nos dicen que usar métodos que cumplen con los estándares es una "mejor práctica" y que usar métodos propietarios es lo contrario. Como ocurre con muchas cosas de la base de datos, "depende", pero sospecho que, en la mayoría de los casos, es mejor que utilice el sys vistas de catálogo a menos que se encuentre en ese escenario poco común en el que está utilizando solo las características en SQL Server que son comunes al estándar. No creo que me haya encontrado con una sola instancia en cualquier capacidad en la que este haya sido el caso, pero estoy más que feliz de saber de ellos, si es que existen.

También he escrito en un blog sobre la falta de fiabilidad de INFORMATION_SCHEMA aquí:

respondido 12 nov., 18:00

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.