SQL Server создает пользовательские типы таблиц с неправильной работой схемы - программирование

SQL Server создает пользовательские типы таблиц с неправильной работой схемы

Я создаю пользовательские типы таблиц на SQL Server 2008R2/2012 с этим утверждением:

CREATE TYPE [MySchemaName].[MyUserTableType] 
   As Table ( [Id] varchar(20) NOT NULL );

Это работает по назначению.

Я также получил хранимую процедуру, которая удаляет весь связанный объект с данной схемой. Здесь мои пользовательские типы таблиц работают неправильно. Я ожидаю что эти типы создаются с помощью связанной схемы.

Если я попытаюсь удалить схему, она будет жаловаться, что схема связана с моим Пользовательским типом таблицы. Следовательно, он не будет удален.

Но если я запрашиваю все объекты в моей базе данных, которые являются TYPE_TABLE, он говорит мне, что мои типы таблиц не принадлежат моей схеме. Они принадлежат к схеме sys

SELECT name, schema_id, type_desc 
FROM [TESTDB].SYS.OBJECTS 
WHERE type_desc = 'TYPE_TABLE';

SELECT * FROM sys.schemas;

Любая идея, почему?

Вот скриншот из моего вывода enter image description here

4b9b3361

Ответ 1

Вместо того, чтобы смотреть в sys.objects для них, вы должны смотреть в sys.types или sys.table_types (который дополнительно предоставляет type_table_object_id).

SELECT name,
       schema_id /*Will be the "test" schema id*/
FROM   sys.types
WHERE  is_table_type = 1
       AND name = 'MyUserTableType'

При создании пользовательского типа он добавляет строку sys.sysscalartypes с предоставленной пользователем схемой и именем и строкой в ​​sys.sysschobjs с системным сгенерированным именем в схеме sys. Сгенерированное имя системы создается путем объединения TT_ + FriendlyName + _ + Hex-версии идентификатора объекта.

Два объекта связаны друг с другом через sys.syssingleobjrefs

/*This query only works via the DAC*/
SELECT so.id AS object_id,
       st.id AS user_type_id,
       *
FROM   sys.sysschobjs so
       JOIN sys.syssingleobjrefs sor
         ON sor.indepid = so.id
       JOIN sys.sysscalartypes st
         ON st.id = sor.depid
WHERE  st.name = 'MyUserTableType'