Types de tables définis par l'utilisateur

Dans SQL Server 2008, un type de table défini par l'utilisateur représente la définition d'une structure de la table. Vous pouvez utiliser un type de table défini par l'utilisateur pour déclarer des paramètres table pour les procédures stockées ou les fonctions, ou pour déclarer des variables de table que vous souhaitez utiliser dans un lot ou dans le corps d'une procédure stockée ou fonction. Pour plus d'informations sur la définition d’une structure de table, consultez CREATE TABLE (Transact-SQL).

Pour créer un type de table défini par l'utilisateur, utilisez l’instruction CREATE TYPE. Pour faire en sorte que les données ayant un type de table défini par l'utilisateur répondent à des spécifications particulières, vous pouvez créer des contraintes et des clés primaires uniques sur le type de table défini par l'utilisateur.

Pour plus d'informations sur les affichages catalogue associés aux types définis par l'utilisateur, consultez sys.types et sys.table_types.

Restrictions

Les types de table définis par l'utilisateur sont soumis aux restrictions suivantes :

  • Un type de table défini par l'utilisateur ne peut pas être utilisé comme colonne dans une table ou champ dans un type défini par l'utilisateur structuré.

  • Les types d’alias sont basés sur un type de table défini par l'utilisateur

  • L’option [NOT FOR REPLICATION] n'est pas autorisée.

  • Les contraintes CHECK requièrent qu'une colonne calculée soit rendue persistante.

  • La clé primaire sur les colonnes calculées doit être PERSISTED et NOT NULL.

  • Un index non cluster ne peut pas être créé sur un type de table défini par l'utilisateur à moins qu’il soit le résultat de la création d’une contrainte PRIMARY KEY ou UNIQUE sur le type de table défini par l'utilisateur. (SQL Server applique les contraintes UNIQUE ou PRIMARY KEY à l'aide d'un index.)

  • Une fois créée, la définition d’un type de table défini par l'utilisateur ne peut pas être modifiée.

  • Les fonctions définies par l'utilisateur ne peuvent pas être appelées dans la définition de colonnes calculées d'un type de table défini par l'utilisateur.

Sécurité

Les autorisations pour les types de table définis par l'utilisateur suivent le modèle de sécurité d'objet pour SQL Server en utilisant les mots clés Transact-SQL suivants : CREATE, GRANT, DENY, ALTER, CONTROL, TAKE OWNERSHIP, REFERENCES, EXECUTE, VIEW DEFINITION, et REVOKE.

Notes

L'autorisation CONTROL sur un type de table entraîne l’octroi de toutes les autres autorisations sur le type de table.

Une liaison de schéma est établie lorsque la fonction dans laquelle se déroule l'instruction DECLARE spécifie WITH SCHEMABINDING. L'autorisation REFERENCES est requise sur le type de table défini par l'utilisateur lorsque ce dernier est un paramètre dans une routine ou lorsque SCHEMABINDING est spécifié. Dans tous les autres cas, aucune liaison de schéma n'est établie et l'autorisation REFERENCES n'est pas requise sur le type de table défini par l'utilisateur.

Pour déclarer une variable de table qui utilise un type de table défini par l'utilisateur, il faut que l’autorisation EXECUTE soit octroyée à ce type de table défini par l'utilisateur.

Notes

L'option CASCADE n'est pas appliquée pour les autorisations de types de table définis par l'utilisateur parce qu'un type de table défini par l'utilisateur ne peut être incorporé dans aucune définition de type.

Exemples

A. Création d'un type de table défini par l'utilisateur

L'exemple suivant montre comment créer un type de table défini par l'utilisateur :

USE AdventureWorks2008R2;
GO

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

B. Révocation des autorisations sur un type de table défini par l'utilisateur

L'exemple suivant indique comment révoquer des autorisations sur un type de table défini par l'utilisateur spécifique. L'autorisation REFERENCES est révoquée pour un utilisateur nommé JoAnna sur le type de table défini par l'utilisateur CustomerListType qui se trouve au sein du schéma relationnel mySchema dans la base de données myDatabase.

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