2012-04-05 13 views
6

Przy użyciu procedury składowanej można wykonać skrypt dla wszystkich tabel w bazie danych.Jak sprawdzić, czy tabele SQL Server są tabelami systemowymi

Istnieją jednak tabele systemowe, które chciałbym wykluczyć z tego. Instynktownie sprawdziłbym właściwości: IsSystemTable lub IsMSShipped. Te nie działają tak jak oczekuję - mam na przykład tabela o nazwie __RefactorLog:

System table

Kiedy jednak zapytać, czy jest to system lub MS Wysyłane tabela, SQL Server zgłasza żaden z moich tabelach System stoły:

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 

i

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 

Kiedy zbadać właściwości tabeli (wewnątrz SSMS), w tabeli oznaczony jako sy obiekt macierzysty. Właściwość obiektu, taka jak IsSystemObject, nie istnieje (AFAIK).

Jak sprawdzić, czy tabela jest obiektem systemowym, oprócz właściwości obiektu? W jaki sposób SSMS sprawdza, czy tabela jest obiektem systemowym?

+0

Chociaż to pytanie wygląda na http://stackoverflow.com/questions/3216219/get-list-of-tables-but-not-include-system-tables-sql-server-2k, nie jest ono duplikowane sposoby sprawdzania właściwości obiektów zmieniły się od czasu SQL Server 2000 i pytam o sposób, w jaki SSMS je sprawdza. – vstrien

+0

Zawsze można uruchomić profiler programu SQL Server na serwerze po otwarciu folderu "Tabele systemowe" i sprawdzić, jaki SQL działa. –

Odpowiedz

8

Management Studio 2008 wydaje się działać trochę dość brzydki kod następujące po otwarciu „Tabele systemowe” folder w Eksploratorze obiektów, klucz nieco wydaje się być:

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] 

(Gdzie tbl jest aliasem dla sys.tables)

Wygląda na to, że jest to kombinacja - albo is_ms_shipped z sys.tables o numerze 1, albo o konkretnym rozszerzonym zestawie właściwości.

1

W przeszłości pracowałem przy założeniu, że w tabeli sys.objects kolumna is_ms_shipped wskazuje, czy obiekt jest lub nie jest obiektem systemowym. (Ta kolumna jest dziedziczona przez inne tabele systemowe, takie jak sys.tables.)

Ta flaga może być ustawiona za pomocą procedury sp_ms_markSystemObject. Jest to jednak nieudokumentowana procedura, nie jest obsługiwana przez Microsoft, nie sądzę, że powinniśmy o tym wiedzieć, więc nie powiedziałem ci o tym.

0

Czy brakuje mi czegoś?

Jednakże istnieją tabele systemowe które chciałbym, aby wykluczyć z tego

Przynajmniej na SQL Server 2008, sp_MSforeachtablejuż stoły system nie obejmuje, jak ten fragment z nim pokazuje:

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

Nie wiem, czy czegoś brakuje, ale gdy wykonuję podane zapytania po zalogowaniu się jako mój użytkownik ETL, zapytanie próbuje również przetworzyć tabelę __RefactorLog (która SSMS określa jako "obiekt systemowy") – vstrien

+2

Raz Po pewnym czasie natknąłem się na fakt, że Enterprise Manager (SQL 2000) został zakodowany na sztywno, aby traktować niektóre tabele jako tabele systemowe, chociaż sam SQL nie oznaczał ich jako takich. (To były tablice diagramów.) Mogą nadal robić takie sztuczki w SSMS ... –

1

__refactorlog, w przeciwieństwie do tego, co sugeruje SSMS, tabela użytkownika. Jest używany podczas wdrażania do śledzenia zmian schematu, których nie można wydedukować z bieżącego stanu bazy danych, na przykład zmiany nazwy tabeli.

Jeśli wszystkie inne tabele użytkowników są w niestandardowym (nie dbo) schemacie, można użyć kombinacji atrybutów isMSshipped/isSystemTable i nazwy schematu, aby zdecydować, czy tabela jest "w zasięgu" skryptu.

Powiązane problemy