2012-04-05 22 views
6

Mit der gespeicherten Prozedur sp_msforeachtable ist es möglich, ein Skript für alle Tabellen in einer Datenbank auszuführen.So überprüfen Sie, ob SQL Server-Tabellen Systemtabellen sind

Allerdings gibt es Systemtabellen, die ich davon ausschließen möchte. Instinktiv würde ich die Eigenschaften IsSystemTable oder IsMSShipped überprüfen. Diese funktionieren nicht wie ich erwarte, dass - ich habe zum Beispiel eine Tabelle __RefactorLog genannt:

System table

Aber wenn ich Frage, ob dies ist ein System oder MS geliefert Tabelle, SQL Server meldet keine meiner Tabellen System Tabellen:

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 

und

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 

als ich in die Eigenschaften der Tabelle aussehen (innen SSMS), wird die Tabelle als sy markiert Stammobjekt. Eine Objekteigenschaft wie IsSystemObject existiert jedoch nicht (AFAIK).

Wie überprüfe ich, ob eine Tabelle ein Systemobjekt ist, abgesehen von der Objekteigenschaft? Wie überprüft SSMS, ob eine Tabelle ein Systemobjekt ist?

+0

Obwohl diese Frage aussieht http://stackoverflow.com/questions/3216219/get-list-of-tables-but-not-include-system-tables-sql-server-2k, ist es nicht doppelt als Die Möglichkeiten zum Überprüfen von Objekteigenschaften haben sich seit SQL Server 2000 geändert und ich frage, wie SSMS es überprüft. – vstrien

+0

Sie können den SQL Server-Profiler immer auf Ihrem Server ausführen, wenn Sie den Ordner "System Tables" öffnen und sehen, welche SQL-Datei ausgeführt wird. –

Antwort

8

Management Studio 2008 scheint eine ziemlich hässlich folgenden Code ausgeführt werden, wenn die „Systemtabellen“ Ordner im Objekt-Explorer zu öffnen, scheint der Schlüssel Bit zu sein:

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] 

(Wo tbl ist ein Alias ​​für sys.tables)

So scheint es, dass es eine Kombination ist - entweder is_ms_shipped von sys.tables ist 1, oder mit einer bestimmten erweiterten Eigenschaft festgelegt.

1

In der Vergangenheit habe ich davon ausgegangen, dass die Spalte is_ms_shipped in der Tabelle sys.objects angibt, ob ein Objekt ein Systemobjekt ist oder nicht. (Diese Spalte wird von anderen Systemtabellen geerbt, z. B. sys.tables.)

Dieses Flag kann von der Prozedur sp_ms_markSystemObject gesetzt werden. Dies ist jedoch eine nicht dokumentierte Prozedur, die von Microsoft nicht unterstützt wird. Ich glaube nicht, dass wir davon wissen sollten, also habe ich Ihnen nichts davon erzählt.

0

Fehle ich etwas?

Allerdings gibt es Systemtabellen, die Ich mag würde aus diesem

Mindestens auf SQL Server 2008, sp_MSforeachtablebereits schließt Systemtabellen auszuschließen, wie dieser Auszug aus es zeigt:

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

Ich weiß nicht, ob Sie etwas vermissen, aber wenn ich die angegebenen Abfragen ausgeführt, während ich als mein ETL-Benutzer angemeldet ist, versucht die Abfrage auch die __RefactorLog-Tabelle (die SSMS bezeichnet als ein 'System-Objekt') – vstrien

+2

Einmal Nach einer Weile stolperte ich über die Tatsache, dass Enterprise Manager (SQL 2000) fest programmiert war, um einige Tabellen als Systemtabellen zu behandeln, obwohl SQL sie selbst nicht als solche markierte. (Dies waren die Diagrammtabellen.) Sie könnten immer noch solche Tricks in SSMS machen ... –

1

__refactorlog ist, im Gegensatz zu dem, was SSMS vorschlägt, eine Benutzertabelle. Es wird während der Bereitstellung verwendet, um Schemaänderungen zu verfolgen, die aus dem aktuellen Datenbankzustand nicht abgeleitet werden können, z. B. das Umbenennen einer Tabelle.

Wenn sich alle anderen Benutzertabellen in einem benutzerdefinierten Schema (Nicht-DBO) befinden, können Sie eine Kombination aus den isMShipped/isSystemTable-Attributen und dem Schemanamen verwenden, um zu entscheiden, ob sich eine Tabelle für das Skript im Geltungsbereich befindet.

Verwandte Themen