Tipos definidos por el usuario

En SQL Server 2008, un tipo de tabla definido por el usuario es un tipo definido por el usuario que representa la definición de una estructura de tabla. Es posible utilizar un tipo de tabla definido por el usuario para declarar los parámetros con valores de tabla para funciones o procedimientos almacenados, o bien para declarar variables de tabla que desee utilizar en un lote o en el cuerpo de un procedimiento o función almacenado. Para obtener información sobre la forma de definir una estructura de tabla, vea CREATE TABLE (Transact-SQL).

Para crear un tipo de tabla definido por el usuario, utilice la instrucción CREATE TYPE. Para asegurarse que los datos en un tipo de tabla definido por el usuario cumplen ciertos requisitos específicos, puede crear restricciones UNIQUE y claves principales en el tipo de tabla definido por el usuario.

Para obtener información sobre las vistas de catálogo asociadas a tipos definidos por el usuario, vea sys.types y sys.table_types.

Restricciones

Los tipos de tabla definidos por el usuario tienen las restricciones siguientes:

  • Un tipo de tabla definido por el usuario no se puede utilizar como columna en una tabla o como campo en un tipo estructurado definido por el usuario.

  • Tipos de alias basados en un tipo de tabla definido por el usuario

  • No se permite la opción [NOT FOR REPLICATION].

  • Las restricciones CHECK exigen que las columnas calculadas sean PERSISTED.

  • La clave principal en las columnas calculadas debe ser PERSISTED y NOT NULL.

  • No es posible crear índices no clúster en un tipo de tabla definido por el usuario a menos que el índice sea el resultado de crear una restricción PRIMARY KEY o UNIQUE en el tipo de tabla definido por el usuario. (SQL Server exige cualquier restricción UNIQUE o PRIMARY KEY por medio del uso de un índice).

  • No es posible modificar la definición de un tipo de la tabla definida por el usuario una vez creado.

  • No es posible llamar a las funciones definidas por el usuario dentro de la definición de columnas calculadas de un tipo de tabla definido por el usuario.

Seguridad

Los permisos para los tipos de tabla definidos por el usuario siguen el modelo de seguridad de objeto para SQL Server por medio del uso de las palabras clave Transact-SQL siguientes: CREATE, GRANT, DENY, ALTER, CONTROL, TAKE OWNERSHIP, REFERENCES, EXECUTE, VIEW DEFINITION y REVOKE.

Nota

El permiso CONTROL en un tipo de tabla implica la aplicación de todos los demás permisos sobre ese tipo de tabla.

Se establece un enlace de esquema cuando la función en la que se da la instrucción DECLARE especifica WITH SCHEMABINDING. El permiso REFERENCES se requiere en el tipo de tabla definido por el usuario cuando el tipo de tabla es un parámetro en una rutina o cuando se especifica SCHEMABINDING. En todos los demás casos, no se establece ningún enlace de esquema y el permiso REFERENCES no se requiere en el tipo de tabla definido por el usuario.

Para declarar una variable de tabla que utiliza un tipo de tabla definido por el usuario, se requiere el permiso EXECUTE en ese tipo de tabla definido por el usuario.

Nota

La opción CASCADE no se exige para los permisos de tipo de tabla definidos por el usuario porque un tipo de tabla definido por el usuario no se puede incrustar en ninguna definición de tipo.

Ejemplos

A. Crear un tipo de tabla definido por el usuario

El ejemplo siguiente muestra cómo crear un tipo de tabla definido por el usuario.

USE AdventureWorks2008R2;
GO

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

B. Revocar permisos en un tipo de tabla definido por el usuario

El ejemplo siguiente muestra cómo revocar los permisos para un determinado tipo de tabla definido por el usuario. Se revoca el permiso REFERENCES de un usuario denominado JoAnna en el tipo de tabla definida por el usuario CustomerListType que está dentro del esquema relacional mySchema en la base de datos myDatabase.

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