2012-04-05 86 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属性和模式名称的组合来决定表是否在脚本的“范围内”。