在 sys.objects 中搜索对象时,我注意到我的 table 类型的名称列有前缀和后缀

Searching objects in sys.objects I noticed that my table types have a prefix and suffix for name column

当我 运行 查询数据库中最近的更改时,我注意到我的 table 类型带有前缀和后缀。

为什么 table 类型会这样?

SELECT type, type_desc, name, create_date, modify_date
FROM sys.objects
ORDER BY create_date desc

用户定义的 table 类型应该主要被认为是类型。这意味着当试图找到关于它们的元数据时,您的起点应该是 sys.types(或 sys.table_types,具体而言),您将在其中找到没有前缀或后缀命名的对象。

此外,当想要探索 table 类型的架构时,应该使用 sys.table_types 中的 type_table_object_id 来找到合适的 sys.object,而不是尝试按名称找到它们。

sys.objects 中,我们可以注意到两件重要的事情 - 这些对象实际上是 sys 模式的一部分,并被标记为 is_ms_shipped。具体而言,这些对象被视为系统对象。它们都存在于 sys 模式中,但需要唯一的名称,这是需要后缀的一个原因。它们还与其他系统对象共享 sys 架构,这表明需要前缀的原因。

所以我会说 TT_ 前缀是为了避免与 sys 模式中的其他对象类型发生命名冲突,而 _47DBAE45 后缀是为了避免多个 table 类型,其中 类型本身 具有相同的名称但存在于不同的架构中。


创建了两种 Students table 类型,一种在 dbo 中(如问题所示),一种在 Xyz 中,我 运行以下查询:

select SCHEMA_NAME(tt.schema_id), tt.name,
       SCHEMA_NAME(so.schema_id),so.name,
      so.is_ms_shipped
from sys.table_types tt
inner join sys.objects so
    on tt.type_table_object_id = so.object_id

显示此结果:

              name                  name                    is_ms_shipped
------------- ----------- --------- ----------------------- -------------
dbo           Students    sys       TT_Students_01142BA1    1
Xyz           Students    sys       TT_Students_02FC7413    1