Partager via


Création d’un assemblage

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 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 inscrire un assembly dans une base de données à l’aide de l’instruction CREATE ASSEMBLY et comment spécifier les paramètres de sécurité de l’assembly.

Instruction CREATE ASSEMBLY

L’instruction CREATE ASSEMBLY est utilisée pour 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 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 portant le même nom, la culture et la 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 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 de base de données ou les rôles d’utilisateur sont autorisés à créer, et donc à posséder des assemblys dans une base de données. Pour créer des assemblys, l’utilisateur ou le rôle de base de données doit disposer de l’autorisation CREATE ASSEMBLY.

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

  • L’assembly appelé ou référencé appartient au même utilisateur ou rôle.

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

Spécification 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_ACCESSou UNSAFE. Lorsque l’instruction CREATE ASSEMBLY est exécutée, certaines vérifications sont effectuées sur l’assembly de code, ce qui peut entraîner l’échec de l’inscription de l’assembly sur le serveur. Pour plus d’informations, consultez l’exemple d’emprunt d’identité sur CodePlex.

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 modifiez 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 avec le SAFE jeu d’autorisations en omettant simplement la troisième ligne de code ci-dessus :

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

Lorsque le code d’un assembly s’exécute sous le jeu d’autorisations SAFE, il ne peut effectuer que des calculs et un accès aux données au sein du serveur via le fournisseur managé in-process.

Création d’assemblys EXTERNAL_ACCESS et UNSAFE

EXTERNAL_ACCESS aborde les scénarios dans lesquels le code doit accéder aux ressources en dehors du serveur, telles que les fichiers, le réseau, le registre et les 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é.

UNSAFE L’autorisation de code 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 EXTERNAL ACCESS ASSEMBLY autorisation (pour les assemblys d’accès externe) ou UNSAFE ASSEMBLY autorisation (pour les assemblys non sécurisés).

  2. Le propriétaire de la base de données (DBO) a EXTERNAL ACCESS ASSEMBLY l’autorisation (pour EXTERNAL ACCESS les assemblys) ou UNSAFE ASSEMBLY (pour UNSAFE les assemblys) et la base de données a la propriété de base de données TRUSTWORTHY définie ONsur .

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

Nous vous recommandons de définir ON la propriété de base de données TRUSTWORTHY sur une base de données uniquement pour exécuter du code CLR (Common Language Runtime) dans le processus du serveur. Au lieu de cela, nous vous recommandons 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, et la connexion doit être accordée EXTERNAL ACCESS ASSEMBLY ou UNSAFE ASSEMBLY autorisation.

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 est utilisée uniquement pour accorder des autorisations ; il n’est pas obligé d’être associé à un utilisateur ou utilisé dans l’application.

Pour créer un assembly, le créateur doit avoir EXTERNAL ACCESS l’autorisationEXTERNAL ACCESS. Cela est spécifié lors de la création de l’assembly :

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

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 spécifier qu’un assembly se charge avec UNSAFE autorisation, vous spécifiez le jeu d’autorisations UNSAFE lors du chargement de l’assembly sur le serveur :

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

Pour plus d’informations sur les autorisations pour chacun des paramètres, consultez CLR Integration Security.

Voir aussi

Gestion des assemblys d’intégration CLR
Modification d’un assembly
Suppression d’un assembly
Sécurité de l’accès au code d’intégration CLR
Propriété TRUSTWORTHY de la base de données
Autorisation d’appelants partiellement approuvés