Comment déboguer les procédures, fonctions et triggers sous SSMS 2008 (SQL Server 2008 Management Studio )

Cet article explique comment déboguer une procédure stockée, une fonction ou un trigger sous SSMS 2008 (SQL Server 2008 Management Studio). En d'autres termes, il explique comment définir des points d'arrêts, comment faire du pas à pas dans les blocs T-SQL, comment consulter le contenu des variables locales et variables systèmes @@, etc.. 6 commentaires Donner une note à l'article (5)

Article lu   fois.

L'auteur

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. Introduction

Une des caractéristiques les plus intéressantes de SSMS 2008 (SQL Server Management Studio 2008) est le support et la capacité de débogage des procédures, fonctions, triggers et lots T-SQL. Nous allons, dans cette publication, expliquer comment mettre en œuvre cette fonctionnalité.

II. Le menu de débogage

Avant toute chose, jetons un coup d'œil sur le menu de débogage. Le menu de débogage présente les éléments de menu pour presque toutes les activités de débogage. Vous pouvez y trouver presque tout ce que vous attendez d'un IDE prenant en charge le débogage.

Menu de débogage

III. Déboguer un lot T-SQL

Vous pouvez déboguer des objets de base de données (procédures stockées, fonctions, etc.), ainsi que les lots T-SQL. Pour déboguer un bloc de code T-SQL, il n'y a rien de plus simple, il suffit de :

1 - Sélectionner les lignes du bloc T-SQL à déboguer. Exemple :

 
Sélectionnez
DECLARE @t INT 
SELECT @t = 1 
WHILE @t < 5 
BEGIN 
  PRINT @t
  SELECT @t = @t +1 
END 
PRINT 'Fin du traitement'

2 - Lancer le débogage, et ce :

* soit en appuyant sur la combinaison de touche ALT + F5.
* soit en sélectionnant le menu Débogage, puis en cliquant sur Démarrer le débogage.

Exemple :

Débogage lot T-SQL

Vous pouvez ajouter ou supprimer des points d'arrêt Point d'arrêt en appuyant sur F9, ou bien en sélectionnant le menu Débogage, puis en cliquant sur Basculer le point d'arrêt.
Exemple :

Débogage T-SQL - Basdculer point d'arrêt

Remarque : Vous pouvez également supprimer ou désactiver des points d'arrêt en faisant un clic droit de la souris sur la marge gauche de l'éditeur de requête dans l'IDE. Exemple :

Débogage lot T-SQL  supprimer ou désactiver point d'arrêt

IV. Informations de débogage

Après avoir démarré le débogage, vous verrez en bas de l'écran deux fenêtres. Chacune des deux fenêtres contient des onglets que vous pouvez sélectionner pour afficher et surveiller les informations de débogage. La fenêtre gauche du débogueur contient les onglets Variables locales, Espion 1. La fenêtre droite du débogueur contient les onglets Pile des appels, Threads, Points d'arrêt, Sortie et Fenêtre de commande.

Informations du débogage

IV-A. Onglet Variables locales

L'onglet Variables locales affiche les informations sur les variables, les paramètres, ainsi que les fonctions système dont le nom commence par @@.

La colonne nom affiche le nom de la variable, du paramètre ou de la fonction système.
La colonne valeur affiche la valeur de la variable, du paramètre ou de la fonction système.
La colonne type affiche le type de données de la variable, du paramètre ou de la fonction système.

Dans cet onglet, il est possible de modifier la valeur d'une variable ou d'un paramètre. Pour cela, il suffit de cliquer avec le bouton droit de la souris sur la ligne concernée, puis de sélectionner modifier la valeur.

Exemple :

Onglet Variables locales

IV-B. Onglet Espion

L'onglet Espion ressemble beaucoup à l'onglet Variables, à la différence près qu'il permet de limiter ou focaliser le suivi sur quelques variables ou paramètres sélectionnés. Il permet également d'afficher les informations sur les fonctions système @@xxx (exemple @@rowcount).

Onglet Espion

Dans cet onglet, il est possible de modifier la valeur d'une variable ou d'un paramètre. Pour cela, il suffit de cliquer avec le bouton droit de la souris sur la ligne concernée, puis de sélectionner modifier la valeur.

5.2 -  Onglet Espions - modifier valeur

Remarquez que l'on ne peut pas modifier la valeur des fonctions système @@xxx (exemple @@rowcount) ; l'option de menu Modifier la valeur est désactivée.

Onglet Espion

IV-C. Onglet Pile des appels

Cet onglet, comme son nom l'indique, affiche les modules de la pile des appels, ainsi que les types de données et les valeurs des paramètres transmis aux modules. Les modules Transact-SQL se composent de procédures stockées, de fonctions et de déclencheurs.

Exemple :

Onget Pile des appels

La colonne Nom de l'onglet Pile d'appels affiche le nom du module, le nom de l'instance, le nom et la valeur de chaque paramètre transmis, et enfin le numéro de la ligne dans le code d'où l'appel a été effectué.

IV-D. Onglet Threads

L'onglet Threads affiche des informations sur le thread du Moteur de base de données utilisé par la session de l'éditeur pour la requête en cours de débogage. Exemple :

Onglet Threads

IV-E. Onglet Points d'arrêt

L'onglet Point d'arrêt affiche tous les points d'arrêt définis dans l'éditeur de requête actuel. Pour gérer les points d'arrêt, utilisez la barre d'outils de la fenêtre Points d'arrêt. Les points d'arrêt sont des emplacements dans le code où l'exécution s'interrompt en mode débogage, pour que vous puissiez consulter les informations de débogage.

Vous pouvez, à l'aide de la barre d'outils de l'onglet Points d'arrêt, supprimer, désactiver ou encore activer un point d'arrêt.
Vous pouvez également atteindre le code source où se situe le point d'arrêt.

Onglet Points d'arrêt

IV-F. Onglet Sortie

Cet onglet contient les messages d'états de plusieurs fonctionnalités de SQL Server Management Studio. Exemple :

Onglet Sortie

IV-G. Onglet Fenêtre Commande

Cet onglet permet d'exécuter des commandes, telles que les commandes de débogage. Pour plus d'informations, consulter l'aide MSDN « Fenêtre Commande Visual Studio »
(http://msdn.microsoft.com/fr-fr/library/c785s0kz.aspx)

Ci-dessous, quelques exemples de commandes utiles :

Vérifier la valeur de la variable @t :

 
Sélectionnez
> debug.print @t   (puis appuyez sur Entrée)
2

Afficher des informations sur les threads actuels :

 
Sélectionnez
>Debug.ListThreads   (puis appuyez sur Entrée)
 
Sélectionnez
Debug.ListThreads
 Index ID     Nom                            Emplacement
--------------------------------------------------------------------------------
*1     300    PC-HAMID [55]                  Niveau3(PC-HAMID.TEMP)

V. Déboguer une procédure stockée

Déboguer des procédures stockées est assez facile avec SSMS. Il suffit de sélectionner l'instruction EXECUTE, puis :

- soit appuyer sur les touches ALT + F5.
- soit sélectionner le menu Débogage, puis cliquer sur Démarrer le débogage.

Au travers d'un exemple concret, nous allons, montrer comment déboguer une procédure avec plusieurs niveaux d'appels imbriqués vers d'autres procédures.

Pour cela, nous allons créer 3 procédures : Niveau1, Niveau2, et Niveau3. La procédure Niveau1 appelle la procédure Niveau2, et la procédure Niveau2 appelle, à son tour, la procédure Niveau3.

 
Sélectionnez

CREATE PROCEDURE dbo.Niveau3
AS 
BEGIN 
   PRINT '...Je suis au Niveau 3'; 
END;    
GO     

CREATE PROCEDURE dbo.Niveau2
AS 
BEGIN 
   PRINT '..Je suis au Niveau 2'; 
   EXECUTE dbo.Niveau3;
   PRINT '..Retour au Niveau 2'; 
END;    
GO     

CREATE PROCEDURE dbo.Niveau1
AS 
BEGIN 
   PRINT '.Je suis au Niveau 1'; 
   EXECUTE dbo.Niveau2; 
   PRINT '.Retour au Niveau 1'; 
END;   
GO     

Pour déboguer la procédure Niveau1, rien de plus simple, il suffit de sélectionner la commande EXECUTE ci-dessous :

 
Sélectionnez

EXECUTE dbo.Niveau1

Puis :
- soit appuyer sur les touches ALT + F5 
- soit sélectionner le menu Débogage, puis cliquer sur Démarrer le débogage, comme illustré dans la copie d'écran ci-dessous :

Débogage Procédure

Une fois le mode débogage démarré, vous pouvez, à l'aide des boutons pas à pas détaillé, principale, etc. Image non disponible naviguer à l'intérieur votre procédure stockée principale, ou à l'intérieur des autres procédures stockées, fonctions, etc., « filles », appelées depuis votre procédure stockée principale ou depuis une procédure « fille ».

Les copies d'écrans ci-dessous montrent un exemple de navigation pas à pas. Observez, pour chaque « point d'arrêt », le contenu de l'onglet « Pile des appels ».

Image non disponible
Image non disponible

Après l'exécution complète du bloc T-SQL, le message ci-dessous s'affiche dans l'onglet message. Il montre les différents niveaux d'imbrication des appels des procédures :

 
Sélectionnez
.Je suis au Niveau 1
..Je suis au Niveau 2
...Je suis au Niveau 3
..Retour au Niveau 2
.Retour au Niveau 1

VI. Déboguer une fonction

SSMS supporte également le débogage des fonctions. Pour déboguer une fonction, sélectionnez la commande T-SQL qui appelle la fonction puis :

- soit appuyer sur les touches ALT + F5
- soit sélectionner le menu Débogage, puis cliquer sur Démarrer le débogage.

Au travers d'un exemple concret, nous allons montrer comment déboguer une fonction. Nous commençons par créer une fonction :

Débogage Fonction

Une fois le mode débogage démarré, vous pouvez, à l'aide des boutons Image non disponiblepas à pas détaillé, principale, etc., naviguer à l'intérieur de la fonction principale ou de la fonction « fille », elle-même appelée à l'intérieur de la première fonction, et ainsi de suite.

Les copies d'écrans ci-dessous montrent un exemple de navigation pas à pas. Observez, pour de chaque « point d'arrêt », le contenu de l'onglet « Pile des appels ».

Image non disponible

Remarque : Auparavant, pour déboguer des procédures stockées, les développeurs utilisaient les commandes PRINT ou SELECT. Ainsi, lorsque votre procédure stockée se comporte de manière inattendue, vous pouviez intégrer certains PRINT ou SELECT et déceler les problèmes dans le code. Toutefois, lorsque quelque chose n'allait pas avec une fonction, il était plus difficile d'identifier le problème. Le support de débogage SSMS 2008 simplifie cette tâche.

VII. Déboguer un trigger

Tout comme les fonctions, les triggers ont toujours été plus difficiles à déboguer. Les développeurs, pour déboguer les triggers, avaient recours à l'instruction PRINT ou aux tables temporaires. Maintenant sous SSMS 2008, cette tâche est devenue très facile. Vous pouvez aisément déboguer des triggers, qu'ils soient de type INSERT, UPDATE ou DELETE, et naviguer à l'intérieur du code du trigger en avançant pas à pas.

Mieux qu'un discours, nous allons montrer comment déboguer un trigger, au travers d'un exemple concret.

Pour cela, nous allons créer une table (dbo.Employees) et un trigger de type AFTER INSERT (dbo.TR_EMPLOYEES_I) établi sur cette table.

 
Sélectionnez
-- Création de la table
CREATE TABLE dbo.Employees(
	Id int NOT NULL IDENTITY (1, 1),
	Nom  varchar(50) NULL,
	Prenom  varchar(50) NULL,
	Salaire decimal(18,2) NULL, 
	DateEmbauche DateTime NULL
	)  
ON [PRIMARY]
GO

--- Ajout de la clé primaire 
ALTER TABLE dbo.Employees
 ADD CONSTRAINT PK_Employees PRIMARY KEY CLUSTERED 
	(
	 Id
	)  
ON [PRIMARY]
GO

-- Création du trigger After Insert, établi sur la table Employees
DROP TRIGGER dbo.TR_Employees_I  
GO 
CREATE TRIGGER dbo.TR_Employees_I 
  ON dbo.Employees 
AFTER INSERT 
AS 
BEGIN
  SET NOCOUNT ON 
 
  DECLARE @Id INT, 
          @Salaire DECIMAL(18,2), 
          @DateEmbauche DATETIME; 
  
  SET @Id = NULL;
  SET @DateEmbauche = NULL; 
  
  SELECT TOP 1 @Id=Id, @DateEmbauche = DateEmbauche 
  FROM INSERTED; 
  
  IF @DateEmbauche < GETDATE()-90  
    SET @Salaire = 100.00 
  ELSE 
    SET @Salaire = 50.00   

   SET @Salaire = POWER(@Salaire, 2) 
  
  UPDATE  Employees 
    SET Salaire = @Salaire 
  FROM Employees 
  WHERE Id = @Id 
 
END  
GO

Pour déboguer le trigger, rien de plus simple ! Il suffit de sélectionner la commande INSERT ci-dessous :

 
Sélectionnez
 -- Bloc T-SQL et Trigger After Insert (TR_Employees_I) à déboger pas à pas ...
INSERT INTO dbo.Employees 
 (Nom, Prenom, DateEmbauche, Salaire) 
VALUES 
 ('Bredont', 'Pierre', GETDATE() - 120, 4000) 
GO     

Puis :
- soit appuyer sur les touches ALT + F5.
- soit sélectionner le menu Débogage, puis cliquer sur Démarrer le débogage, comme illustré dans la copie d'écran ci-dessous :

Débogage Trigger

Une fois le débogage lancé, pour pouvez, à l'aide des boutons pas à pas détaillé, principale, etc. Image non disponible naviguer à l'intérieur du trigger et scruter les valeurs des variables, comme le montre la copie d'écran ci-dessous :

Débogage Trigger

VIII. Remerciements

Je tiens à remercier ced (Cédric Duprez) pour sa relecture attentive de cet article. Je remercie également Daniel Adam, Djug, et tous ceux qui m'ont apporté leur soutien et leur aide.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+