Nous savons tous que pouvoir gérer le versioning du code source de ses applications est devenu un prérequis dans le domaine de la réalisation informatique.
J’ai pu constater au fil de mes expériences que cette pratique était très bien entrée dans les mœurs au niveau du code source de l’application mais qu’au niveau de la base de données, il y avait encore des efforts à faire et que nous n’avions pas encore trouvé la solution idéale.

Au niveau de la gestion des sources des bases de données, j’ai pu observer que l’on pouvait aller de l’inexistence totale du moindre versioning, jusqu’à la pratique de méthode plus ou moins artisanale ,qui obligeait finalement à chaque fois les équipes à développer leurs propres outils pour manipuler leurs sources correctement.

Il existe de nombreux systèmes qui permettent de gérer ses sources efficacement, et Microsoft propose, dans Visual Studio, un système de gestion de base de données qui continue d’évoluer au fil des mises à jour.
J’ai donc décidé de vous présenter sur plusieurs articles comment utiliser cet outil intégré à Visual Studio.

Initialisation et intégration dans TFS

Commençons par l’initialisation du projet de base de données. Cette solution se créant dans Visual Studio, cela nous permettra très simplement d’intégrer cette solution dans TFS comme tout autre projet .NET.

Création du projet dans Visual Studio

La première étape consiste à créer un projet de base de données. Pour cela aller dans la fenêtre d’ajout de projet : Fichier > Nouveau > Projet
Dans l’arbre de gauche, choisissez dans la branche Database le template SQL Server.

creation projet

Choisissez le projet en fonction de la version de votre base de données. Vous pouvez dès à présent attacher ce projet à votre serveur TFS en cochant la case « Add to Source control ».

Quel type d’objet peut-on manipuler ?

L’un des intérêts de ce projet est que vous pouvez gérer tous les types d’objets de votre base de données à partir de Visual Studio. Cependant, pour commencer je vous conseille de vous focaliser sur cette liste d’objets et de continuer à gérer le reste au niveau de vos serveurs directement :

  • Schema
  • Table
  • View
  • Stored procedure
  • Function
  • Trigger
  • Index
  • Constraint
  • Key

Importer une base de données existante dans Visual Studio

Votre projet est à présent créé. Il faut donc l’alimenter. Vous avez 2 solutions pour importer le modèle de votre base, qui sont dans le menu contextuel à la racine du projet

  • “Import Script” permet d’importer le contenu d’un fichier SQL pour l’insérer dans votre projet Visual Studio. Si vous possédez un fichier qui contient tout le script de la création de votre base, vous pouvez utilisez cette option, mais cela est rarement le cas… Regardons donc plutôt la seconde option
  • “Import Database Objects and Settings” est l’option parfaite pour initialiser votre projet et récupérer votre existant mais il ne peut être utilisé qu’une seule fois par projet.

Pour importer vos données, nous allons donc utiliser la seconde option “Import Database Objects and Settings” :

1. Créer une connexion à votre base

nouvelle base

2. Appuyer sur Start

nouvelle base

Si une erreur apparait au début du traitement, il est fort probable que vous ayez un problème de droit au niveau de votre connexion à la base

3. Et voilà votre base est prête à l’emploi dans Visual Studio

Essayez de compiler votre base, puis si cela fonctionne, vous pouvez archiver votre projet dans votre Team Project de votre serveur TFS.
Cette étape étant terminée vous pourrez archiver toutes vos modifications à vos tâches TFS. Ceci est un point très positif au niveau de l’ALM (Application Lifecycle Management) car vous pourrez suivre l’évolution de votre modèle de données en vous appuyant sur TFS.

Audit du code

L’une des capacités très intéressante de cette solution est que vous pouvez à présent compiler le projet au cours de ses modifications pour détecter si la solution est toujours intacte et sans erreur.
Vous pourrez donc aisément détecter le code mort au niveau de la base de données.

Détection du code mort

Par exemple, si au cours des différentes modifications, vous décidez de renommer ou supprimer une colonne, la compilation vous permettra de détecter si certaines parties ne fonctionnent plus à la condition d’éviter les « SELECT * » dans vos scripts.
De plus, la structure de votre base étant gérée par fichier, vous pouvez utiliser les fonctions de recherche présentes dans Visual Studio.
Enfin, afin de détecter le code mort, il ne faut surtout pas négliger les warning que peut vous signaler le compilateur, car ce type de problème peut apparaitre sous cette forme dans le résultat de la compilation.

Référence avec d’autres bases du serveur

De plus, si vous consultez d’autres bases de données directement, vous pourrez référencer les autres bases afin de détecter s’il n’y a pas de code mort dans cette autre base et dans les scripts SQL qui les lient.
Pour cela la marche à suivre est simple. Il suffit d’ajouter un autre projet dans votre solution comme dans la première partie de cet article, pour ensuite rajouter une référence à une base voisine :
Faite apparaitre un niveau des références le menu contextuel et choisissez l’option « Add Database Reference ».

  1. Choisissez le projet de la base référencée que vous venez d’ajouter.
  2. Cocher « Define database variable »
  3. Cocher « Literal »
  4. Saisissez dans « value » le nom de la base

referencement

Si vos noms de base changent en fonction vos environnements (Base_DEV, Base_PRD,…), il est préférable de remplacer vos appels à cette base par une variable SQLCMD au lieu de la déclaration littérale.
La syntaxe des variables du mode d’exécution SQLCMD est la suivante :   $(nomDeVariable)
Il faut ensuite remplacer dans votre solution la valeur par sa variable correspondante en ajoutant des crochets autour : [$(nomDeVariable)].

IntelliSense et contrôle d’intégrité

A présent, nous avons un projet de base de données sans erreur et qui est branché sur TFS. Il est donc parfait pour servir de modèle de référence de la base à déployer et d’assurer le contrôle de qualité de l’évolution de celle-ci.
Pour faire vivre votre base de données, l’idéal est d’utiliser en priorité votre projet dans Visual Studio plutôt que de directement tout modifier en base de données.
Il est important de procéder dans ce sens pour le suivi des modifications et pour ne pas oublier d’archiver une modification dans TFS.
La bonne nouvelle est que si vous travailliez sur SQL Server 2008 avec une base en 2008, vous allez retrouver dans VS2010 le T-SQL IntelliSense qui apporte du confort et de la fiabilité à l’écriture du code. C’est une nouveauté de la version 2010 qui n’était pas présente dans les précédentes versions de Visual Studio.

Comment ajouter un nouvel objet dans son projet ?

Pour ajouter des objets dans la base de données c’est très simple. Placez-vous dans l’arborescence au niveau du type d’objet que vous voulez rajouter

arborescence

Par le menu contextuel, vous pouvez choisir le type d’objet à ajouter. Une fenêtre apparait où vous n’avez plus qu’à saisir le nom de l’objet souhaité pour ensuite générer un squelette.

referencement

Si vous utilisez plusieurs schémas dans votre base de données alors il faut faire attention à celui qui apparait lors de la création d’objet ! En effet, Visual Studio initialise le schéma de votre objet créé en fonction de la valeur définie par défaut dans les propriétés de votre projet. Il ne prend malheureusement pas en compte celui où vous avez placé votre curseur lors de la création…

nouvelle procédure stockée

Le squelette de votre objet est généré, vous pouvez à présent écrire son contenu. L’IntelliSense activé vous pouvez écrire vos objets avec cet assistant et il soulignera en rouge toutes les parties du code qui sont erronées afin de détecter les premières erreurs sans compilation.
N’oubliez pas de compiler la solution pour vérifier sa syntaxe pour valider la nouvelle version de la base.

Comment importer un objet de ma base de données vers mon projet ?

D’autres systèmes de mise à jour existent. L’un d’entre eux est l’importation de script.
Il peut arriver que nous ne puissions pas toujours appliquer la best practice et que certaines modifications aient été faites directement en base de données. Il faut donc impérativement mettre à jour le projet pour ne pas risquer de perdre cette information importante.
Malgré le fait que cette pratique soit à éviter, elle reste complètement rattrapable. Nous vous avons présenté précédemment “Import Script” lors l’initialisation du projet. Cette action n’était pas la plus pratique au départ, mais est idéale pour permettre la remise à niveau.
Pour rattraper vos précédentes modifications, il vous suffit de récupérer toutes vos mises à jour et de les mettre dans un ou plusieurs fichier(s) SQL et d’utiliser l’“Import Script”:

1. Appuyer sur Next
2. Conseil : Décocher les propriétés étendues
3. Appuyer sur Finish

import script

Votre projet est à présent remis à niveau.

Conclusion

Vous disposez à présent de toutes les informations nécessaires pour initialiser et maintenir votre base de données depuis Visual Studio.
Cela n’est bien sûr qu’une première étape dans l’exploitation de ce système. Nous n’avons finalement découvert  que les premiers apports de ce système :

  • l’ALM de la base de données par TFS
  • l’audit et la gestion du code mort par le compilateur
  • Le contrôle d’intégrité avec l’IntelliSense

Nous avons donc à notre disposition un système très intéressant mais qui présente encore quelques défauts :

  • Le système de gestion de schéma n’est pas encore au point lors de la création d’objet
  • Il faut créer ses objets au bon endroit dans l’arborescence ou les ranger manuellement sinon cela devient très vite le chaos

Malgré cela, il offre de nombreux avantages que nous vous présenterons dans de futurs articles :

  • Déployer les nouvelles modifications dans la base de données
  • Créer des tests unitaires sur les objets de la base de données
  • Préparation de la base de données pour des tests d’acceptation ou  des tests de performance.

Notre prochaine étape sera donc la présentation du système de déploiement qui se base sur un système de comparaison afin de générer les scripts de livraison.