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 lorsque vous travaillez avec des objets CLR sur une base de données qui a été déplacée à partir d’une autre instance de SQL Server.

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

Symptômes

Envisagez le scénario ci-dessous. Vous détachez ou sauvegardez une base de données qui se trouve dans une instance de SQL Server. L’instance de SQL Server est en cours d’exécution sur le serveur A. Par la suite, vous attachez ou restaurez cette base de données sur une instance de SQL Server qui s’exécute sur le serveur B. Dans ce scénario, vous pouvez observer les symptômes suivants :

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

    MSG 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. Les ressources du serveur sont peut-être insuffisantes ou l’assembly ne peut pas être approuvé avec PERMISSION_SET = EXTERNAL_ACCESS ou unsafe. Exécutez à nouveau la requête ou consultez la documentation pour savoir 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 une de ses dépendances. Une erreur liée à la sécurité s’est produite. (Exception à partir 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) dans System. Reflection. assembly. InternalLoad (AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) à System. Reflection. assembly. InternalLoad (String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark

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

    Serveur : MSG 10327, niveau 14, état 1, ligne 1
    La création de l’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) dispose de l’autorisation d’ASSEMBLy d’accès externe et la base de données a la propriété de base de données digne de confiance ; ou l’assembly est signé avec un certificat ou une clé asymétrique disposant d’une connexion correspondante avec l’autorisation d’ASSEMBLy d’accès externe.

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

Cause

Ce problème se produit car la connexion que vous utilisez pour créer la base de données sur le serveur A ne se trouve pas dans l’instance de SQL Server sur le serveur B. Il peut s’agir de la connexion Microsoft Windows ou de la connexion SQL Server.

Solution de contournement

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

Notes

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

  • 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 définir le propriétaire de la base de données sur sa:

    USE <DatabaseName>
    GO
    
    EXEC sp_changedbowner 'sa'
    

    Notes

    Dans cette instruction, <DatabaseName> est un espace réservé au 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 tâche donnée. Par exemple, le propriétaire de la base de données doit disposer de l’autorisation créer un ASSEMBLy pour créer un assembly.

  • Ajoutez la connexion sur l’instance de SQL Server sur le serveur A qui est utilisée pour créer la base de données sur l’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 l’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 à la nouvelle connexion SQL Server que vous créez sur l’instance de SQL Server sur le serveur B. Pour ce faire, spécifiez l’argument SID de l' CREATE LOGIN instruction.

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 contient un SID DBO qui ne correspond pas, le même problème peut se produire.

Pour plus d’informations, reportez-vous au blog suivant : ingénieurs SQL Server.

Références