Utilisation de types définis par l’utilisateur dans les bases de données
Lorsque vous créez un type défini par l'utilisateur, il est utilisé localement par une base de données unique. Autrement dit, un type défini par l'utilisateur défini dans une base de données ne peut pas être utilisé dans une définition de colonne d'une autre base de données. Néanmoins, si ce même type défini par l'utilisateur est inscrit et accessible dans deux bases de données, vous pouvez convertir une valeur de ce type d'une base de données pour l'utiliser dans une autre base de données. Cette possibilité s'avère utile quand vous voulez :
- appeler une procédure stockée définie dans une base de données différente ;
- interroger des tables définies dans deux bases de données différentes ;
- sélectionner des données dans une base de données pour les insérer dans une autre.
Par exemple, supposons que le type défini par l'utilisateur u1 soit créé à la fois dans la base de données db1 et la base de données db2. La procédure stockée p2 n'est créée que dans la base de données db2 et prend un paramètre du type u1. Vous pouvez appeler la procédure p2 comportant une occurrence du type u1 à partir de la base de données db1.
USE db1
DECLARE @u u1
EXEC db2.dbo.p2 @u
GO
Voici un autre exemple qui illustre le remplissage d'une table temporaire dans la base de données tempdb avec les résultats d'une requête. Le type défini par l'utilisateur doit être inscrit dans tempdb pour que cette opération aboutisse.
INSERT INTO #t SELECT * FROM T
Il n'est pas nécessaire d'inscrire un type défini par l'utilisateur dans tempdb si vous utilisez un type défini par l'utilisateur dans une variable de table ou si un curseur l'utilise dans une table de travail.
Lorsque vous utilisez des types définis par l'utilisateur dans des bases de données, vous devez garder à l'esprit les points suivants :
- Les types doivent avoir le même nom, y compris le même nom CLR, et ils doivent être mis en œuvre à travers le même assembly dans les deux bases de données. Les assemblys des deux bases de données sont identiques s'ils partagent les mêmes nom, nom fort, culture, version, jeu d'autorisations d'accès et le même contenu binaire.
- Vous devez disposer des autorisations SELECT et EXECUTE sur chaque colonne associée au type défini par l'utilisateur et référencée dans la requête. Ces autorisations sont vérifiées d'après la base de données dans laquelle chaque colonne est définie.
- Si un type mis en œuvre dans un assembly appelle une méthode dans un autre assembly, l'appel d'assembly croisé est vérifié de la même manière que si la requête du type défini par l'utilisateur était émise sans croisement de bases de données.
Voir aussi
Concepts
Utilisation de types CLR définis par l'utilisateur