Vous pouvez recevoir un message d’erreur lorsque vous essayez d’exécuter un objet CLR existant ou de créer un assembly qui dispose du jeu d’autorisations external_access ou non sécurisé sur une base de données qui est attachée ou restaurée à partir d’un autre serveur


Erreur n ° : 423365 (SQLBUDT)

Symptômes


Considérez le scénario suivant. Pour détacher ou sauvegarder une base de données qui se trouve dans une instance de SQL Server 2005. L’instance de SQL Server 2005 est en cours d’exécution sur le serveur A. Par la suite, vous joignez ou restaurez cette base de données dans une instance de SQL Server 2005 qui s’exécute sur le serveur B. Dans ce scénario, vous pouvez découvrir les symptômes suivants :
  • Lorsque vous essayez d’exécuter un objet CLR (Common Language Runtime) existant qui dispose de l’external_access ou d’une autorisation Insafe définie à partir de la base de données sur le serveur B, le message d’erreur suivant s’affiche :
    MSG 10314, niveau 16, état 11, erreur de ligne 2An 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 ne peut pas être approuvé avec PERMISSION_SET = EXTERNAL_ACCESS ou unsafe. Exécutez de nouveau la requête ou consultez la documentation pour découvrir comment résoudre les problèmes de confiance de l’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 = neutre, PublicKeyToken = nul’ou l’une de ses dépendances. Une erreur relative à la sécurité s’est produite. (Exception de HRESULT : 0x8013150A) System. IO. FileLoadException : à System. Reflection. assembly. nLoad (nom de fichier AssemblyName, le code base de chaîne, le assemblySecurity de l’assembly locationHint, le StackCrawlMark& stackMark, le throwOnFileNotFound booléen, la valeur booléenne forIntrospection) sur System. Reflection. assembly. InternalLoad (AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean ForIntrospection) dans System. Reflection. assembly. InternalLoad (chaîne assemblyString, Evidence AssemblySecurity&
  • Lorsque vous essayez de créer un assembly qui dispose de l’external_access ou d’un ensemble d’autorisations Insafe dans la même base de données, le message d’erreur suivant s’affiche :
    Serveur : MSG 10327, niveau 14, état 1, l’ASSEMBLy 1CREATE 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) possède une autorisation d’ASSEMBLy d’accès externe et la propriété de base de données TRUSTWORTHY est activée. ou l’assembly est signé avec un certificat ou une clé asymétrique ayant un nom d’utilisateur correspondant avec une 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 Trustworthy sur activé.

Cause


Ce problème se produit car la connexion utilisée pour créer la base de données sur le serveur a n’est pas dans l’instance de SQL Server 2005 sur le serveur B. Il peut s’agir d’une connexion Microsoft Windows ou d’une 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 propriété de base de données digne de confiance .
  • Utilisez la procédure stockée sp_changedbowner pour changer le propriétaire de la base de données en As ou en 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>GOEXEC sp_changedbowner ‘sa’
    Remarque 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 avoir les autorisations correspondantes pour effectuer une tâche spécifique. 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 à l’instance de SQL Server 2005 sur le serveur a qui est utilisée pour créer la base de données à l’instance de sql Server 2005 sur le serveur B. S’il s’agit d’un compte de domaine, vous pouvez créer la même connexion sur le serveur B. Accordez ensuite les autorisations requises à la connexion dans l’instance de SQL Server 2005 sur le serveur B. S’il s’agit d’une connexion SQL Server, assurez-vous que le SID de cette connexion correspond à la nouvelle connexion SQL Server créée sur l’instance de SQL Server 2005 sur le serveur B. Pour cela, spécifiez l’argument SID de l’instruction CREATe LOGIN.

Informations supplémentaires


Si vous accédez à l’objet CLR à partir d’une autre base de données, et qu’il ne correspond pas à celui de la base de données, le même problème peut se produire. Pour plus d’informations, consultez le blog suivant :

Statut


Microsoft a confirmé l’existence de ce problème dans les produits Microsoft figurant dans la liste des produits concernés par cet article.

Références


Pour plus d’informations sur l’instruction CREATe LOGIN, visitez le site Web Microsoft Developer Network (MSDN) suivant : Pour plus d’informations sur la procédure stockée sp_changedbowner , visitez le site Web MSDN suivant : Pour plus d’informations sur la déclaration de création d’ASSEMBLy, visitez le site Web MSDN suivant :