用户定义表类型

在 SQL Server 2008 中,用户定义表类型是指用户所定义的表示表结构定义的类型。您可以使用用户定义表类型为存储过程或函数声明表值参数,或者声明您要在批处理中或在存储过程或函数的主体中使用的表变量。有关如何定义表结构的详细信息,请参阅 CREATE TABLE (Transact-SQL)

若要创建用户定义表类型,请使用 CREATE TYPE 语句。为了确保用户定义表类型的数据满足特定要求,您可以对用户定义表类型创建唯一约束和主键。

有关与用户定义类型相关联的目录视图的信息,请参阅 sys.typessys.table_types

限制

用户定义表类型具有下列限制:

  • 用户定义表类型不能用作表中的列或结构化用户定义类型中的字段。

  • 基于用户定义表类型的别名类型

  • [NOT FOR REPLICATION] 选项是不允许的。

  • CHECK 约束要求保留计算列。

  • 计算列的主键必须是 PERSISTED 和 NOT NULL。

  • 无法对用户定义表类型创建非聚集索引,除非该索引是对用户定义表类型创建 PRIMARY KEY 或 UNIQUE 约束的结果。(SQL Server 使用索引强制实施任何 UNIQUE 或 PRIMARY KEY 约束。)

  • 在创建用户定义表类型定义后不能对其进行修改。

  • 不能在用户定义表类型的计算列的定义中调用用户定义函数。

安全性

用户定义表类型的权限通过使用下列 Transact-SQL 关键字来遵循 SQL Server 的对象安全模式:CREATE、GRANT、DENY、ALTER、CONTROL、TAKE OWNERSHIP、REFERENCES、EXECUTE、VIEW DEFINITION 和 REVOKE。

注意注意

对某表类型的 CONTROL 权限意即对该表类型的所有其他权限。

DECLARE 语句所在的函数指定 WITH SCHEMABINDING 时,将建立架构绑定。表类型是例程中的一个参数或指定了 SCHEMABINDING 时,需要对用户定义表类型具有 REFERENCES 权限。在所有其他情况下,不会建立任何架构绑定,也不需要对用户定义表类型具有 REFERENCES 权限。

若要声明使用某个用户定义表类型的表变量,需要对该用户定义表类型具有 EXECUTE 权限。

注意注意

不能对用户定义表类型强制实施 CASCADE 选项,因为用户定义表类型无法嵌入到任何类型定义中。

示例

A. 创建用户定义表类型

下面的示例显示了如何创建用户定义表类型。

USE AdventureWorks2008R2;
GO

/* Create a user-defined table type */
CREATE TYPE LocationTableType AS TABLE 
( LocationName VARCHAR(50)
, CostRate INT );
GO

B. 撤消对用户定义表类型的权限

下面的示例显示如何撤消对特定用户定义表类型的权限。名为 JoAnna 的用户对位于数据库 myDatabase 中关系架构 mySchema 中的用户定义表类型 CustomerListType 的 REFERENCES 权限被撤销。

USE myDatabase;
GO
REVOKE REFERENCES ON TYPE::[mySchema].[CustomerListType] FROM JoAnna;
GO