Nouvelles Chroniques d'Amethyste

Penser au Sens, pas au Verbe

Déployer les données avec SSDT

Poster un commentaire

SSDT est un outil merveilleux que vous devez ABSOLUMENT installer dans tous vos projets pour gérer votre base de données.

SSDT assure la cohérence entre vos bases et les scripts placés dans TFS (ou autre repository), il peut comparer des schémas et signaler des différences, mettre à jour, il peut également vous indiquer qu’une colonne utilisée dans une procédure stockée a disparue de la table.

Vous pouvez en outre déployer, examiner le contenu de vos tables…

Un outil indispensable, surtout sous Windows Azure ou Management Studio a beaucoup de limitations.

Une fonctionnalité qui manque est de pouvoir lier un schéma de table à un jeu de valeurs de référence. On ne peut pas encore le faire, mais on peut se rapprocher du but comme nous allons le voir.

On commence par créer un répertoire Script dans le projet et on y ajoute un nouvel item de la façon suivante:

20-03-2014 21-36-19

Notez bien les propriétés de ce fichier:

20-03-2014 21-36-44

C’est important car sinon le reste ne fonctionnera pas.

Notez un point important: il ne peut y avoir qu’un seul fichier PostDeploy. Mais il peut lancer plusieurs autres fichiers.

Le fichier obtenu devrai ressembler à celui-ci:

20-03-2014 21-37-11

Ok, on fait quoi maintenant?

On attend l’ajout de procédures INSERT, UPDATE ou DELETE. Depuis SQL Server 2008 on dispose d’une syntaxe plus compacte avec MERGE qui les remplacent toutes.

Pour notre démonstration nous prenons comme modèle la table suivante:

20-03-2014 21-58-30

Les deux dernières colonnes peuvent être initialisée à NULL. Le script de MERGE pourrait ressembler à celui-ci:

SET IDENTITY_INSERT dbo.Timeline ON

MERGE INTO  dbo.Timeline as target
using (values
(1,'T1')
,(2,'T4')
,(5,'T6')
)
as source (idtimeline,nom)
on target.idtimeline = source.idtimeline

-- juste une maj d'un enregistrement qui existe
when matched then
update set nom=source.nom

-- existe dans la source, mais pas dans la cible
when not matched by target then
insert (idtimeline,nom) values (idtimeline,nom)

-- existe dans la cible, mais pas dans la source
when not matched by source then
delete
;

SET IDENTITY_INSERT dbo.Timeline OFF

on définit deux variables source et target. Target est la base cible, source est la source de données déclarée dans le bloc using.

Vous remarquerez les différentes conditions et à chaque condition l’action à entreprendre.
On oublie pas le ; (point-virgule) final!

Comment on le fait fonctionner?

Le script sera lancé durant un Publish depuis Visual Studio ou bien depuis un DACPAC. Mais il n’est pas interdit de le lancer à la main.

Pour cela ouvrez le menu SQL/Transact-SQL Editor/New Query

Passez l’éditeur en mode SQLCOMMAND en cliquant sur le dernier bouton de la barre d’icônes:

20-03-2014 22-59-21

Saisissez la commande SQLCMD:

:r

suivie du chemin complet du fichier de post déploiement (faites le glisser dans l’éditeur). Sur ma machine j’ai ceci:

:r D:\Source\Projet\XXX\Database\FVAdmin\Scripts\PostDeployment.sql
Il ne reste plus qu’à lancer l’exécution.

Si vous chargez des scripts depuis les script de post déploiement à l’aide de la commande :r, n’oubliez pas de déclarer son Build action à NONE.

Amusez vous bien!

Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s