Modifiez la sénescence de la database du server SQL

Lorsque j'essaie de modifier le classment de la database de la casse insensible à la casse, j'obtiens une erreur comme suit:

Msg 5030, niveau 16, état 2, ligne 1 La database n'a pas pu être exclusivement verrouillée pour effectuer l'opération. Msg 5072, niveau 16, état 1, ligne 1 ALTER DATABASE a échoué. Le classment par défaut de la database 'e_mail' ne peut pas être défini sur SQL_Latin1_General_CP1_CS_AS.

S'il vous plaît aidez-moi à résoudre ce problème

Je suppose que vous avez encore un tas de connections utilisant cette database qui l'empêche d'être verrouillé pour modifier le classment. D'où cette partie de votre erreur:

La database n'a pas pu être exclusivement verrouillée pour effectuer l'opération

Donc, vous aurez besoin de

  • Planifier des time d'arrêt
  • Informez vos users
  • Définissez votre database en mode mono-user (pour empêcher d'autres connections et verrous)
  • Ensuite, exécutez votre instruction alter database

Quelque chose comme…

ALTER DATABASE [e_mail] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; GO ALTER DATABASE [e_mail] COLLATE SQL_Latin1_General_CP1_CS_AS; GO ALTER DATABASE [e_mail] SET MULTI_USER; GO 

S'il s'agit d'une database de production, il s'agit d'une entreprise majeure et d'un changement beaucoup plus important qu'il n'y paraît. C'est potentiellement l'un des changements les plus compliqués que vous pouvez faire car il affecte toutes les colonnes de la database existantes. Si vous êtes encore en développement, honnêtement, il peut être plus facile d'écrire le schéma et les valeurs de données et de recommencer dans une nouvelle database.

Pourquoi est-ce si compliqué? Principalement parce que la modification du classment de la database n'est pas rétroactive. Cela ne changera pas le classment pour les objects existants (tables, vues, udfs, etc.). Au lieu de cela, vous devez modifier chaque object pour le corriger s'il fait reference à un champ de caractères. S'il existe un index, une key primaire ou étrangère ou une contrainte sur un champ de caractères, vous devrez peut-être supprimer l'index, la contrainte ou la key avant de pouvoir modifier le classment, puis rappend l'object par la suite. Vous devez également être sûr que l'application d'une collation insensible à la casse ne va pas créer des valeurs keys en double lorsque l' Ohio et l' OHIO deviennent soudainement des valeurs équivalentes.

En outre, la modification du paramètre de niveau de database ne modifie pas le classment au niveau du server (c'est-à-dire le classment sur la database master). Cela signifie que votre database d'application n'a peut-être pas le même classment que les bases de données master et tempdb. Planifiez et testez en conséquence, car cela peut provoquer des erreurs si vous utilisez tempdb. Vous pouvez changer le classment sur tempdb, mais changer le classment sur la database master n'est pas impossible, mais c'est encore less facile que de changer le classment d'une database user.

Il existe plusieurs scripts SQL personnalisés qui contiennent différents niveaux de logique pour gérer ce problème, mais je ne ferais automatiquement confiance à mes données à aucun d'entre eux sans générer les scripts, en lisant les scripts entiers, puis en les testant complètement dans un test environnement.

Le document Microsoft est ici . Les commands que vous devez exécuter pour répondre directement à votre question et modifier le classment par défaut de la database sont ci-dessous. Cette opération mettra fin à toutes les connections actives à la database de tous les autres users et annulera toutes les transactions en attente.

 USE [master] GO ALTER DATABASE [e_mail] SET SINGLE_USER WITH ROLLBACK IMMEDIATE GO ALTER DATABASE [e_mail] SET SINGLE_USER GO ALTER DATABASE [e_mail] COLLATE SQL_Latin1_General_CP1_CS_AS GO ALTER DATABASE [e_mail] SET MULTI_USER WITH ROLLBACK IMMEDIATE GO ALTER DATABASE [e_mail] SET MULTI_USER GO 

Pourquoi exécuter SET SINGLE_USER et SET MULTI_USER deux fois? Tout simplement parce que dans mon expérience, le server va parfois lancer une erreur après la première fois que vous changez le mode user. Cela peut être un bug de versions antérieures, un problème avec ma configuration matérielle, ou une autre raison, mais j'ai gardé mes scripts identiques pendant de nombreuses années quand j'ai eu besoin de changer le mode user et d'exécuter immédiatement une command qui nécessite mode mono-user, et la redondance n'a causé aucun problème.