Cette semaine, j’ai eu droit à une belle leçon de vie avec SQL Server. Quelque chose qui replace l’orgueil du développeur au bon endroit.
En fait, ce n’est pas tant que j’ai commis une grave erreur. Il s’agit plus que j’aie pris connaissance d’un concept qui m’était inconnu jusqu’à présent. Pourtant, il s’agit d’une fonctionnalité au cœur même de SQL Server.
À la fin de ce billet, il y a de bonnes chances que vous vous aillez appris quelque chose aussi. En tout cas, moi j’ai appris quelque chose!
L’histoire
Comme beaucoup d’histoires de ce genre, tout a commencé par un problème qui ne devait pas en être un. C’est quand vous vous dites: « Voyons, ça devrait marcher! » qu’il y a anguille sous roche.
Tout a commencé lorsque j’ai entrepris de me créer une base de données avec Entity Framework. Pour une raison que j’ignorais, à chaque fois que j’exécutais mon application, la base de données créée basée sur mon modèle de données était en mode SINGLE_USER. Cela faisait en sorte qu’au bout de quelques appels SQL, la connexion précédente bloquait toute nouvelle connexion à la base de données.
C’est à moment que le festival de la recherche Google a débuté… et j’en suis revenu bredouille. Il n’y avait littéralement PERSONNE qui avait expérimenté mon problème avant.
Le plus intrigant dans cette situation, c’est qu’il est très suspect d’associer Entity Framework à cette problématique. Après tout, l’ORM est seulement le messager entre la base de données et vous.
Une révélation
À partir de ce moment, j’avais déjà passé pas mal de temps à tripoter les différentes fonctionnalités d’initialisation de base de données d’Entity Framework sans succès.
L’étape suivante de mon plan de match était de voir ce que donnerait la création d’une base de données à la main avec la commande SQL CREATE DATABASE. Il s’agit aussi de l’instant que j’ai eu la révélation. Il s’avérait que même les bases de données créées manuellement étaient créées en mode SINGLE_USER. Tiens, tiens, comme c’est curieux!
Mes recherches m’ont rapidement mené à la base de données système nommée model. Son nom est assez explicite pour deviner à quoi elle sert.
La base de données model est utilisée comme gabarit pour les bases de données que vous allez créer sur votre instance SQL. Chacune des personnalisations que vous ferez sur celle-ci sera intégralement répliquée sur vos nouvelles bases de données.
Mon problème et ma solution étaient situés exactement là. model était justement en mode SINGLE_USER. Cela faisait en sorte que cette configuration était rapatriée sur mes nouvelles bases de données.
La question, qui va rester sans réponses, est: comment ai-je réussi à appliquer cette configuration sur cette très importante base de données? Jusqu’à cette heure, je suis sans explications.
Et puis, alors, avez-vous appris quelque chose de cette leçon d’humilité?