Business Geek

Aller au contenu | Aller au menu | Aller à la recherche

vendredi 10 août 2007

Stopper un script de déploiement avec DBPros

Dans mon script de pré-déploiement, je souhaite arrêter le déploiement si une base de données n'existe pas.

Comme indiqué en entête de Script.PreDeployment.sql, je me décide à utiliser la syntaxe de SQLCMD (qui sera utilisé pour jouer mon script).

J'écris donc une commande de ce style :

IF NOT EXISTS (SELECT 1 FROM [sys].[databases] WHERE [name] = N'$(DatabaseName)')
   QUIT

Seulement, comme pour les variables, l'étape de parsing à la compilation d'un projet de base de données ne supporte pas le mot-clé QUIT (ni EXIT d'ailleurs). Donc impossible de sortir du script sur une condition.

Solution de contrournement : lever une erreur avec l'instruction RAISERROR et utiliser l'option -b avec SQLCMD pour stopper le script sur erreur

IF NOT EXISTS (SELECT 1 FROM [sys].[databases] WHERE [name] = N'$(DatabaseName)')
  RAISERROR(N'Database $(DatabaseName) does not exists, setup could not be execute.',0,1)

 

lundi 6 août 2007

Gestion des variables dans Visual Studio Team Edition for Database Professionals SR1

J'étais super content que la SR1 de TeamDB (ou DBPros alias Visual Studio Team Edition for Database Professional) sorte enfin des cartons. En effet, j'en avais besoin pour utiliser les variables au niveau projet. J'ai été un peu déçu de voir qu'on ne pouvait les utiliser que dans un contexte restreint.

Laissez moi vous décrire le besoin que j'avais dans mes scripts de pré et post déploiement. Je voulais appliquer des scripts conditionnels en fonction du mode de compilation (release ou debug). Ce que je voudrais ressemblerait à peu près à cela :

IF $(DEBUG) = 1
 Begin
 --test data for development environment
 INSERT INTO dbo.myTable VALUES('some data')
 End

Dans les propriétés du projet ça donne cela :

Mais $(DEBUG) utilisé comme ci-dessus génère une erreur au parsing pendant la compilation. En effet, selon l'outil, on ne peut pas utiliser une variable de cette façon alors que c'est conforme avec la syntaxe de l'outil SQLCMD qui est utilisé par DBPros pour jouer le script sur le serveur. Le parsing de la compilation n'accepte que l'utilisation dans une chaîne de caractères ou comme nom d'entité SQL Server (une table ou un serveur lié); ex : Select * From [$(TableName)].

J'utilise alors la solution de contournement suivante qui j'avoue n'est pas très élégante mais qui fonctionne :

Declare @debug as int
Select @debug = cast('$(DEBUG)' as int)
If  @debug = 1
  Begin
  --do my stuff
  print 'DEBUG MODE!!!'
  End

Si vous trouvez un méthode plus élégante, je suis preneur...