2012-04-05 11 views
6

Usando el procedimiento almacenado sp_msforeachtable es posible ejecutar una secuencia de comandos para todas las tablas en una base de datos.Cómo comprobar si las tablas de SQL Server son tablas de sistema

Sin embargo, hay tablas del sistema que me gustaría excluir de eso. Instintivamente, verificaría las propiedades IsSystemTable o IsMSShipped. Estos no funcionan como espero - Tengo por ejemplo, una tabla llamada __RefactorLog:

System table

Pero cuando me consulta si se trata de un sistema o MS Enviado tabla, SQL Server informa de que ninguno de mis cuadros son del sistema tablas:

exec (N'EXEC Database..sp_msforeachtable "PRINT ''? = '' + CAST(ObjectProperty(Object_ID(''?''), ''IsSystemTable'') AS VARCHAR(MAX))"') AS LOGIN = 'MyETLUser' 
-- Results of IsSystemTable: 
[dbo].[__RefactorLog] = 0 
[schema].[myUserTable] = 0 

y

exec (N'EXEC Database..sp_msforeachtable "PRINT ''? = '' + CAST(ObjectProperty(Object_ID(''?''), ''IsMSShipped'') AS VARCHAR(MAX))"') AS LOGIN = 'MyETLUser' 

-- Results of IsMSShipped: 
[dbo].[__RefactorLog] = 0 
[schema].[myUserTable] = 0 

Cuando miro en las propiedades de la tabla (en el interior SSMS), la tabla se marca como SY objeto tallo Sin embargo, no existe una propiedad de objeto como IsSystemObject (AFAIK).

¿Cómo puedo comprobar si una tabla es un objeto del sistema, además de la propiedad del objeto? ¿Cómo comprueba SSMS si una tabla es un objeto del sistema?

+0

Aunque esta pregunta se parece a http://stackoverflow.com/questions/3216219/get-list-of-tables-but-not-include-system-tables-sql-server-2k, no se duplica como las formas de verificar las propiedades de los objetos han cambiado desde SQL Server 2000 y estoy preguntando cómo lo verifica SSMS. – vstrien

+0

Siempre puede ejecutar el perfilador de SQL Server contra su servidor al abrir la carpeta "Tablas del sistema" y ver qué SQL está ejecutando. –

Respuesta

8

estudio de gestión 2008 parece correr un cierto código siguiente bastante feo cuando se abren las "Tablas del sistema" carpeta en el Explorador de objetos, el bit de clave parece ser:

CAST(
case 
    when tbl.is_ms_shipped = 1 then 1 
    when (
     select 
      major_id 
     from 
      sys.extended_properties 
     where 
      major_id = tbl.object_id and 
      minor_id = 0 and 
      class = 1 and 
      name = N''microsoft_database_tools_support'') 
     is not null then 1 
    else 0 
end   
      AS bit) AS [IsSystemObject] 

(Donde tbl es un alias para sys.tables)

Parece que es una combinación, is_ms_shipped de sys.tables es 1 o tiene un conjunto de propiedades ampliado determinado.

1

En el pasado he trabajado suponiendo que, en la tabla sys.objects, la columna is_ms_shipped indica si un objeto es o no es un objeto del sistema. (Esta columna se hereda con otras tablas del sistema, como sys.tables).

Este indicador se puede establecer mediante el procedimiento sp_ms_markSystemObject. Esto, sin embargo, es un procedimiento no documentado, no es compatible con Microsoft, no creo que se suponga que sepamos al respecto, por lo que no se lo conté.

0

¿Echo de menos algo?

Sin embargo, hay tablas del sistema, que me gustaría excluir de esa

Al menos en SQL Server 2008, sp_MSforeachtableya tablas del sistema excluye, en este extracto de la muestra:

+ N' where OBJECTPROPERTY(o.id, N''IsUserTable'') = 1 ' + N' and o.category & ' + @mscat + N' = 0 ' 
+0

No sé si te falta algo, pero cuando ejecuto las consultas dadas cuando estoy conectado como usuario de ETL, la consulta también intenta procesar la tabla __RefactorLog (que SSMS designa como 'Objeto del sistema') – vstrien

+2

Una vez en un momento, tropecé con el hecho de que Enterprise Manager (SQL 2000) estaba codificado para tratar algunas tablas como tablas del sistema, aunque el propio SQL no las marcaba como tal. (Esta era la tabla de diagramas.) Todavía podrían estar haciendo trucos como este en SSMS ... –

1

__refactorlog es, a diferencia de lo que sugiere SSMS, una tabla de usuario. Se usa durante el despliegue para rastrear cambios de esquema que no se pueden deducir del estado actual de la base de datos, por ejemplo, cambiar el nombre de una tabla.

Si todas las demás tablas de usuario están en un esquema personalizado (no dbo), puede utilizar una combinación de los atributos isMSshipped/isSystemTable y el nombre del esquema para decidir si una tabla está 'en alcance' para su secuencia de comandos.

Cuestiones relacionadas