Erreur lors de l’exécution d’un objet CLR existant ou de la création d’un assembly

Cet article vous aide à résoudre deux problèmes différents qui peuvent se produire lors de l’utilisation d’objets CLR sur une base de données qui a été déplacée d’une autre instance de SQL Server.

Version du produit d’origine : SQL Server
Numéro de la base de connaissances d’origine : 918040

Symptômes

Prenons le cas de figure suivant. Vous détachez ou sauvegardez une base de données qui se trouve dans une instance de SQL Server. Le instance de SQL Server s’exécute sur le serveur A. Plus tard, vous attachez ou restaurez cette base de données à un instance de SQL Server qui s’exécute sur le serveur B. Dans ce scénario, vous pouvez rencontrer les symptômes suivants :

  • Lorsque vous essayez d’exécuter un objet CLR (Common Language Runtime) existant qui a le external_access jeu d’autorisations ou non sécurisé à partir de la base de données qui se trouve sur le serveur B, le message d’erreur suivant s’affiche :

    Message 10314, niveau 16, état 11, ligne 2
    Une erreur s’est produite dans Microsoft .NET Framework lors de la tentative de chargement de l’ID d’assembly 65536. Le serveur est peut-être à court de ressources ou l’assembly peut ne pas être approuvé avec PERMISSION_SET = EXTERNAL_ACCESS ou UNSAFE. Réexécutez la requête ou case activée documentation pour voir comment résoudre les problèmes d’approbation d’assembly. Pour plus d’informations sur cette erreur :
    System.IO.FileLoadException : impossible de charger le fichier ou l’assembly 'AssemblyName, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' ou l’une de ses dépendances. Une erreur relative à la sécurité s’est produite. (Exception de HRESULT : 0x8013150A) System.IO.FileLoadException :
    sur System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) sur System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) sur System.Reflection.Assembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) sur System.Reflection.Assembly.Load(String assemblyString)

  • Lorsque vous essayez de créer un assembly qui a le external_access jeu d’autorisations ou non sécurisé dans la même base de données, vous recevez le message d’erreur suivant :

    Serveur : Message 10327, Niveau 14, État 1, Ligne 1
    CREATE ASSEMBLY pour l’assembly 'AssemblyName' a échoué, car l’assembly 'AssemblyName' n’est pas autorisé pour PERMISSION_SET = EXTERNAL_ACCESS. L’assembly est autorisé lorsque l’une des conditions suivantes est vraie : le propriétaire de la base de données (DBO) a l’autorisation EXTERNAL ACCESS ASSEMBLY et la base de données a la propriété de base de données TRUSTWORTHY activée ; ou l’assembly est signé avec un certificat ou une clé asymétrique qui a une connexion correspondante avec l’autorisation EXTERNAL ACCESS ASSEMBLY.

Les problèmes se produisent même si vous avez déjà défini la Trustworthy propriété de base de données sur ON.

Cause

Ce problème se produit car la connexion que vous utilisez pour créer la base de données sur le serveur A n’est pas dans la instance de SQL Server sur le serveur B. Cette connexion peut être la connexion Microsoft Windows ou la connexion SQL Server.

Solution de contournement

Pour contourner ce problème, utilisez l’une des méthodes suivantes.

Remarque

Avant d’utiliser les méthodes suivantes, veillez à activer la Trustworthy propriété de base de données.

  • Utilisez la sp_changedbowner procédure stockée pour remplacer le propriétaire de la base de données par sa ou par une connexion disponible sur le serveur B. Par exemple, vous pouvez utiliser l’instruction suivante pour remplacer le propriétaire de la base de données par sa :

    USE <DatabaseName>
    GO
    
    EXEC sp_changedbowner 'sa'
    

    Remarque

    Dans cette instruction, <DatabaseName> est un espace réservé du nom de la base de données sur laquelle vous travaillez. Le propriétaire de la base de données modifié doit disposer des autorisations correspondantes pour effectuer une certaine tâche. Par exemple, le propriétaire de la base de données doit disposer de l’autorisation CREATE ASSEMBLY pour créer un assembly.

  • Ajoutez la connexion sur le instance de SQL Server sur le serveur A utilisé pour créer la base de données à la instance de SQL Server sur le serveur B.

Si la connexion est un compte de domaine, vous pouvez créer la même connexion sur le serveur B. Accordez ensuite les autorisations requises à la connexion sur le instance de SQL Server sur le serveur B.

Si la connexion est une connexion SQL Server, assurez-vous que le SID de cette connexion correspond au nouveau SQL Server connexion que vous créez sur le instance de SQL Server sur le serveur B. Pour ce faire, spécifiez l’argument SID de l’instruction CREATE LOGIN .

Plus d’informations

Si vous accédez à l’objet CLR à partir d’une autre base de données et que cette base de données a un SID DBO incompatible, le même problème peut se produire.

Pour plus d’informations, consultez le blog suivant : CSS SQL Server Engineers.

References