Impossible de créer un package de mise à jour logicielle ou une application après le déplacement de la base de données du site

Cet article fournit une solution au problème selon lequel vous ne pouvez pas créer un groupe de mises à jour logicielles, un package de mise à jour logicielle ou une application après avoir déplacé la base de données du site Configuration Manager SQL Server.

Version d’origine du produit : Microsoft System Center 2012 Configuration Manager
Numéro de la base de connaissances d’origine : 2709082

Symptômes

Après avoir déplacé la base de données du site Configuration Manager SQL Server vers un autre lecteur, puis essayé de créer un groupe de mises à jour logicielles, un package de mise à jour logicielle ou une application, l’opération échoue et ces entrées de journal sont enregistrées dans le fichier SMSProv.log :

*** Erreur SQL inconnue ! Fournisseur SMS 14-03-2012 07 :56 :47 2016 (0x07E0)
*~*~*** Erreur SQL inconnue ! ThreadID : 2016 , DbError : 50000 , Sev : 16~*~* Fournisseur SMS 14-03-2012 07 :56 :47 2016 (0x07E0)
[24000][0][Microsoft][SQL Server Native Client 10.0]Fournisseur SMS d’état de curseur non valide 14-03-2012 07 :56 :48 2016 (0x07E0)
*~*~[24000][0][Microsoft][SQL Server Native Client 10.0]État du curseur non valide *** Erreur SQL inconnue ! ThreadID : 2016 , DbError : 0 , Sev : 0~*~* Fournisseur SMS 14-03-2012 07 :56 :48 2016 (0x07E0)

SQL Server Profiler fournit les informations supplémentaires suivantes :

Une erreur s’est produite dans Microsoft .NET Framework lors de la tentative de chargement de l’ID d’assembly 65539. 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 « cryptoutility, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 » ou l’une de ses dépendances. Une erreur relative à la sécurité s’est produite. (Exception de HRESULT : 0x8013150A)
System.IO.FileLoadException :
at 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)

Cause

Ce problème peut se produire si les fichiers MDF et LDF de la base de données de site SQL Server sont déplacés vers un autre lecteur. Par exemple, ce problème peut se produire si la base de données de site Configuration Manager est créée sur C:\Program files\MSSQL server\data, puis que les fichiers MDF et LDF sont déplacés vers D:\CM2012DB pour économiser de l’espace.

Remarque

Il s’agit d’une opération de SQL Server prise en charge. Pour plus d’informations, consultez Déplacer une base de données à l’aide du détachement et de l’attachement (Transact-SQL).

Ce problème se produit parce que la propriété de base de données TRUSTWORTHY de la base de données de site qui est définie sur ON par défaut est réinitialisée à OFF lorsque vous détachez et rattachez la base de données. Lorsque la base de données n’est pas configurée pour que la propriété ait la valeur ON, <ConfigMgr_Install>\bin\x64\CryptoUtility.dll ne parvient pas à se charger dans SQL Server et vous recevez le message d’erreur d’état de curseur non valide mentionné dans la section Symptômes.

Résolution

Pour résoudre ce problème, procédez comme suit :

  1. Réinitialisez manuellement la propriété sur ON en exécutant cette commande sur votre base de données Configuration Manager :

     ALTER DATABASE <ConfigMgr DB>
     SET TRUSTWORTHY ON
    
  2. Assurez-vous que la base de données qui a été déplacée appartient au compte SA.

  3. Vérifiez que la valeur Niveau d’isolation est définie sur READ_COMMITTED_SNAPSHOT. Pour case activée cette valeur, exécutez la commande suivante :

     DBCC USEROPTIONS
    
  4. Si la valeur du niveau d’isolation est définie sur autre chose que READ COMMITTED SNAPSHOT, exécutez les commandes suivantes dans l’ordre donné :

    ALTER DATABASE <ConfigMgr DB>
    SET ALLOW_SNAPSHOT_ISOLATION ON
    
    ALTER DATABASE <ConfigMgr DB>
    SET READ_COMMITTED_SNAPSHOT ON
    

Remarque

Vous devrez peut-être modifier la base de données SQL Server en mode mono-utilisateur avant d’exécuter les commandes à l’étape 4. Pour plus d’informations sur la façon de détacher et d’attacher une base de données dans SQL Server, consultez Détachement et attachement de base de données (SQL Server).

Plus d’informations

Une trace iDNA (Voyage dans le temps) du processus SQL Server montre l’exception suivante :

Nombre d’exceptions de ce type : 3
Exception MethodTable : 000007fef2524e30
Objet exception : 0000000201027798
Type d’exception : System.IO.FileLoadException
Message : Impossible de charger le fichier ou l’assembly « cryptoutility, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 » ou l’une de ses dépendances. Une erreur relative à la sécurité s’est produite. (Exception de HRESULT : 0x8013150A)
InnerException : <none>
StackTrace (généré) :
Sp IP, fonction
00000000204F8DC0 0000000000000001
System.Reflection.Assembly._nLoad(System.Reflection.AssemblyName, System.String,
System.Security.Policy.Evidence, System.Reflection.Assembly, System.Threading.StackCrawlMark ByRef, Boolean, Boolean)
00000000204F8DC0 000007FEF23DBF61
System.Reflection.Assembly.InternalLoad(System.Reflection.AssemblyName, System.Security.Policy.Evidence, System.Threading.StackCrawlMark ByRef, Boolean)
00000000204F8E50 000007FEF23DC127 System.Reflection.Assembly.InternalLoad(System.String, System.Security.Policy.Evidence, System.Threading.StackCrawlMark ByRef, Boolean)
00000000204F8EB0 000007FEF2443A54 System.Reflection.Assembly.Load(System.String)
00000000204F8EF0 000007FF002D9FF7
System.Data.SqlServer.Internal.SqlAppDomain.LoadRawAssembly(Char*, Int32, IntPtr ByRef,
System.Data.SqlServer.Internal.EClrReturnCode ByRef