SQL Server创建架构工作不正常的用户定义表类型
我使用以下语句在SQL Server 2008R2/2012上创建用户定义的表类型:SQL Server创建架构工作不正常的用户定义表类型,sql,sql-server,schema,user-defined-types,Sql,Sql Server,Schema,User Defined Types,我使用以下语句在SQL Server 2008R2/2012上创建用户定义的表类型: CREATE TYPE [MySchemaName].[MyUserTableType] As Table ( [Id] varchar(20) NOT NULL ); 这正是我们想要的 我还得到了一个存储过程,它删除了给定模式中所有关联的对象。 这就是我的用户定义表类型无法正常工作的地方。我期待着 这些类型是使用关联的架构创建的 如果我试图删除该模式,它会抱怨该模式与我的用户定义表类型相关联。因此,
CREATE TYPE [MySchemaName].[MyUserTableType]
As Table ( [Id] varchar(20) NOT NULL );
这正是我们想要的
我还得到了一个存储过程,它删除了给定模式中所有关联的对象。
这就是我的用户定义表类型无法正常工作的地方。我期待着
这些类型是使用关联的架构创建的
如果我试图删除该模式,它会抱怨该模式与我的用户定义表类型相关联。因此,它不会被删除
但如果我查询数据库中所有类型为_TABLE的对象,它会告诉我,我的表类型不属于我的模式。它们属于架构“sys”
SELECT name, schema_id, type_desc
FROM [TESTDB].SYS.OBJECTS
WHERE type_desc = 'TYPE_TABLE';
SELECT * FROM sys.schemas;
知道为什么吗
这是我的输出截图
不要在
sys.objects
中查找这些对象,而应该在sys.types
或sys.table\u types
中查找这些对象(这还公开了type\u table\u object\u id
)
创建用户定义的类型时,它会在sys.sysscalartypes
中使用用户提供的架构和名称添加一行,在sys
架构中使用系统生成的名称添加一行到sys.sysschobjs
。系统生成的名称是通过连接对象id的十六进制版本创建的
这两个实体通过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'
我的理解是,用户定义的类型总是分配给“SYS”模式,因此这是预期的行为。用户定义的模式可以分配给函数、过程、表和触发器
/*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'