SQL Server dbo.sysdiagrams是用户表还是系统表?

25

当在简单的数据库中使用数据库图表时,SQL Server会在表/系统表节点(在Microsoft管理工具/对象资源管理器中)中创建一个dbo.sysdiagrams表。但是sysdiagrams表在SQL Server中标记为用户表。您可以通过以下查询获取用户表。

SELECT * 
FROM sys.tables t
WHERE OBJECTPROPERTY(t.object_id,'IsUserTable') = 1

enter image description here

我不知道sysdiagram表是系统表还是用户表。

在sysdiagram的扩展属性中存在值为1的microsoft_database_tools_support,这确定了此表是否自动创建。

enter image description here

2个回答

19

Management Studio在确定“系统对象”时使用以下内容,其中“tbl”是sys.tables:

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]

我需要知道管理工作室是如何将一个看起来像用户表的东西移动到树的系统表分支中的。这回答了我的问题,并允许我避免在我的脚本中硬编码表名。 - Jimmy Bosse
我刚刚在 SQL Server 2014 上检查了 'sys.objects'。 - Marcus Vinicius Pompeu

12

系统表在SQL Server内部使用,每个用户数据库中的系统表都是相同的。

从服务器角度来看,sysdiagrams并不是系统表。

但SQL Server Management Studio创建它来存储图表数据,因此也将其归类为系统表。

您可以使用您提到的扩展属性来排除这种类型的系统表。


4
我对这个表很好奇。但无论是在 sys.objects 还是 sys.tables 中都没有标记为 is_ms_shipped,而且任何指向它是系统表的标志也都是零。那么怎么才能检查它呢? - Yaroslav
@atesio 我刚刚将一个数据库中除系统表以外的所有表复制到另一个数据库中。我是否必须将dbo.sysdiagrams也复制到新的数据库中? - J.S. Orris
1
复制dbo.sysdiagrams不是必须的,此表存储了图表数据(在SQL Server Management Studio中设计,除了模型文档化之外无其他用途)。如果您想要转移图表,则可以复制此表的内容,然后在目标数据库上查看这些图表。 - Alain Tésio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接