2012-04-05 44 views
6

使用存儲過程sp_msforeachtable可以爲數據庫中的所有表執行腳本。如何檢查SQL Server表是否是系統表

但是,我想從中排除系統表。本能地,我會檢查屬性IsSystemTableIsMSShipped。這些不工作像我期待的 - 我有例子的表稱爲__RefactorLog

System table

但是,當我詢問這是否是出貨臺系統或MS,SQL Server報告沒有我的表是系統表:

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 

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 

當我看到表的屬性(內部SSMS),該表被標記爲SY莖對象。 (AFAIK)不存在像IsSystemObject這樣的對象屬性。

如何檢查表是否是系統對象,除了對象屬性? SSMS如何檢查表是否是系統對象?

+0

雖然這個問題看起來像http://stackoverflow.com/questions/3216219/get-list-of-tables-but-not-include-system-tables-sql-server-2k,它不是作爲複製自SQL Server 2000以來,檢查對象屬性的方式已經發生了變化,我正在問SSMS如何檢查它。 – vstrien 2012-04-05 13:56:18

+0

你總是可以對您的服務器上運行SQL Server Profiler中打開「系統表」文件夾時,看它的運行了哪些SQL。 – 2012-04-05 14:04:17

回答

8

管理Studio 2008中,似乎在對象資源管理器中打開「系統表」文件夾時運行一些相當難看下面的代碼,鍵位似乎是:

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] 

(其中tblsys.tables的別名)

所以它似乎是一個組合 - is_ms_shippedsys.tables是1,或具有特定的擴展屬性集。

1

在過去,我一直在假設在sys.objects表中,列is_ms_shipped指示對象是否是系統對象。 (此列由其他系統表(例如sys.tables)繼承。)

此標誌可以通過過程sp_ms_markSystemObject進行設置。然而,這是一個沒有文檔記錄的程序,並不是微軟支持的,我不認爲我們應該知道它,所以我沒有告訴你。

0

我錯過了什麼嗎?

不過,也有我想從

至少排除SQL Server 2008上,sp_MSforeachtable已經排除系統表其系統表,從它的摘錄顯示:

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

我不知道,如果你失去了一些東西,但是當我執行給定的查詢,在登錄我的ETL用戶,查詢也嘗試處理__RefactorLog表(SSMS指定爲「系統對象」) – vstrien 2012-04-05 14:29:23

+2

一旦很久以前,我碰到的事實失腳是企業管理器(SQL 2000)是硬編碼來治療一些表系統表,但SQL本身標誌沒有它們的方式。 (這是圖表)。他們可能仍然在SSMS中這樣做。 – 2012-04-05 15:10:54

1

__refactorlog與SSMS建議的不同之處在於用戶表。它在部署期間用於跟蹤不能從當前數據庫狀態推導出的模式更改,例如重命名錶。

如果您的所有其他用戶表都位於自定義(非dbo)模式中,則可以使用isMSshipped/isSystemTable屬性和模式名稱的組合來決定表是否在腳本的「範圍內」。