Création d’un assembly

S’applique à : SQL Server

Les objets de base de données managés, tels que les procédures stockées ou les déclencheurs, sont successivement compilés et déployés dans des unités appelées « assemblys ». Les assemblys DLL managés doivent être inscrits dans Microsoft SQL Server avant que les fonctionnalités de l’assembly puissent être utilisées. Pour inscrire un assembly dans une base de données SQL Server, utilisez l’instruction CREATE ASSEMBLY. Cette rubrique explique comment enregistrer un assembly dans une base de données à l'aide de l'instruction CREATE ASSEMBLY, puis comment spécifier les paramètres de sécurité de l'assembly.

Instruction CREATE ASSEMBLY

L'instruction CREATE ASSEMBLY permet de créer un assembly dans une base de données. Voici un exemple :

CREATE ASSEMBLY SQLCLRTest  
FROM 'C:\MyDBApp\SQLCLRTest.dll';  

La clause FROM spécifie le nom du chemin d'accès de l'assembly à créer. Ce chemin d'accès peut être soit un chemin UNC (Universal Naming Convention), soit le chemin d'accès d'un fichier physique stocké localement sur l'ordinateur.

SQL Server n'autorise pas l'inscription de différentes versions d'un assembly avec le même nom, la même culture et la même clé publique.

Il est possible de créer des assemblys qui référencent d'autres assemblys. Lorsqu’un assembly est créé dans SQL Server, SQL Server crée également les assemblys référencés par l’assembly de niveau racine, si les assemblys référencés ne sont pas déjà créés dans la base de données.

Les utilisateurs ou les rôles d'utilisateurs de base de données se voient accorder des autorisations pour créer, et de ce fait acquérir, des assemblys dans une base de données. Pour être en mesure de créer des assemblys, l'utilisateur ou le rôle d'utilisateur de base de données doit bénéficier de l'autorisation CREATE ASSEMBLY.

Un assembly peut parvenir à référencer d'autres assemblys uniquement si :

  • l'assembly appelé ou référencé est possédé par le même utilisateur ou rôle ;

  • l'assembly appelé ou référencé a été créé dans la même base de données.

Définition de la sécurité lors de la création d'assemblys

Lors de la création d’un assembly dans une base de données SQL Server, vous pouvez spécifier l’un des trois niveaux de sécurité différents dans lesquels votre code peut s’exécuter : SAFE, EXTERNAL_ACCESS ou UNSAFE. Au moment de l'exécution de l'instruction CREATE ASSEMBLY , l'assembly de code est soumis à certains contrôles qui peuvent entraîner l'échec de l'enregistrement de l'assembly sur le serveur.

SAFE est le jeu d'autorisations par défaut et fonctionne pour la majorité des scénarios. Pour spécifier un niveau de sécurité donné, vous devez modifier la syntaxe de l'instruction CREATE ASSEMBLY comme suit :

CREATE ASSEMBLY SQLCLRTest  
FROM 'C:\MyDBApp\SQLCLRTest.dll'  
WITH PERMISSION_SET = SAFE;  

Il est également possible de créer un assembly à l'aide du jeu d'autorisations SAFE par simple omission de la troisième ligne de code ci-dessus :

CREATE ASSEMBLY SQLCLRTest  
FROM 'C:\MyDBApp\SQLCLRTest.dll';  

Lorsque le code dans un assembly s'exécute sous le jeu d'autorisations SAFE , tout calcul ou accès aux données sur le serveur ne peut avoir lieu que par l'entremise du fournisseur managé in-process.

Création d'assemblys EXTERNAL_ACCESS et UNSAFE

EXTERNAL_ACCESS propose des scénarios dans lesquels le code doit accéder à des ressources externes au serveur, tel que des fichiers, le réseau, le Registre et des variables d'environnement. Lorsque le serveur accède à une ressource externe, il emprunte l'identité du contexte de sécurité de l'utilisateur appelant le code managé.

L’autorisation de code UNSAFE concerne les situations dans lesquelles un assembly n’est pas vérifiable sécurisé ou nécessite un accès supplémentaire aux ressources restreintes, telles que l’API Microsoft Win32.

Pour créer un assembly EXTERNAL_ACCESS ou UNSAFE dans SQL Server, l’une des deux conditions suivantes doit être remplie :

  1. L'assembly est signé avec un nom fort ou porte une signature Authenticode avec certificat. Ce nom fort (ou certificat) est créé à l’intérieur de SQL Server en tant que clé asymétrique (ou certificat) et dispose d’une connexion correspondante avec l’autorisation EXTERNAL ACCESS ASSEMBLY (pour les assemblys d’accès externe) ou l’autorisation UNSAFE ASSEMBLY (pour les assemblys non sécurisés).

  2. Le propriétaire de la base de données (DBO) bénéficie de l'autorisation EXTERNAL ACCESS ASSEMBLY (pour les assemblys EXTERNAL ACCESS ) ou UNSAFE ASSEMBLY (pour les assemblys UNSAFE ) et la TRUSTWORTHY Database Property de la base de données est définie sur ON.

Les deux conditions mentionnées ci-dessus sont également vérifiées au moment du chargement de l'assembly (exécution incluse). Une des conditions doit au minimum être satisfaite pour le chargement de l'assembly.

Nous vous recommandons de ne pas définir la TRUSTWORTHY Database Property sur ON dans une base de données uniquement afin d'exécuter le code du CLR (Common Language Runtime) dans le processus serveur. Il est préférable, à la place, de créer une clé asymétrique à partir du fichier d'assembly dans la base de données master. Une connexion mappée à cette clé asymétrique doit ensuite être créée. Cette connexion doit disposer de l'autorisation EXTERNAL ACCESS ASSEMBLY ou UNSAFE ASSEMBLY .

Les instructions Transact-SQL suivantes effectuent les étapes requises pour créer une clé asymétrique, mapper une connexion à cette clé, puis accorder EXTERNAL_ACCESS autorisation à la connexion. Vous devez exécuter les instructions Transact-SQL suivantes avant d’exécuter l’instruction CREATE ASSEMBLY.

USE master;   
GO    
  
CREATE ASYMMETRIC KEY SQLCLRTestKey FROM EXECUTABLE FILE = 'C:\MyDBApp\SQLCLRTest.dll'     
CREATE LOGIN SQLCLRTestLogin FROM ASYMMETRIC KEY SQLCLRTestKey     
GRANT EXTERNAL ACCESS ASSEMBLY TO SQLCLRTestLogin;   
GO   

Remarque

Vous devez créer une connexion à associer à la clé asymétrique. Cette connexion permet uniquement d'accorder des autorisations ; elle ne doit pas être associée à un utilisateur ni utilisée dans l'application.

Pour créer un assembly EXTERNAL ACCESS , la personne chargée de le créer doit posséder l'autorisation EXTERNAL ACCESS . Elle est spécifiée au moment de créer l'assembly :

CREATE ASSEMBLY SQLCLRTest  
FROM 'C:\MyDBApp\SQLCLRTest.dll'  
WITH PERMISSION_SET = EXTERNAL_ACCESS;  

Les instructions Transact-SQL suivantes effectuent les étapes requises pour créer une clé asymétrique, mapper une connexion à cette clé, puis accorder l’autorisation UNSAFE à la connexion. Vous devez exécuter les instructions Transact-SQL suivantes avant d’exécuter l’instruction CREATE ASSEMBLY.

USE master;   
GO    
  
CREATE ASYMMETRIC KEY SQLCLRTestKey FROM EXECUTABLE FILE = 'C:\MyDBApp\SQLCLRTest.dll';     
CREATE LOGIN SQLCLRTestLogin FROM ASYMMETRIC KEY SQLCLRTestKey ;    
GRANT UNSAFE ASSEMBLY TO SQLCLRTestLogin ;  
GO  

Pour préciser qu'un assembly est chargé avec l'autorisation UNSAFE , vous devez spécifier l'autorisation UNSAFE définie lors du chargement de l'assembly sur le serveur :

CREATE ASSEMBLY SQLCLRTest  
FROM 'C:\MyDBApp\SQLCLRTest.dll'  
WITH PERMISSION_SET = UNSAFE;  

Pour obtenir des informations détaillées sur les autorisations pour chacun de ces paramètres, consultez CLR Integration Security.

Voir aussi

Gestion des assemblys d’intégration du CLR
Modification d’un assembly
Suppression d’un assembly
Sécurité d’accès du code d’intégration du CLR
Propriété de base de données TRUSTWORTHY