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

Hamid MIRA

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.. Commentez

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

- Auteur : Hamid MIRA

- Parution : 10 mai 2011

- Mise à jour : 28 juin 2011

- Licence :

Sommaire

- I. Introduction

- II. Le menu de débogage

- III. Déboguer un lot T-SQL

- IV. Informations de débogage

- IV-A. Onglet Variables locales

- IV-B. Onglet Espion

- IV-C. Onglet Pile des appels

- IV-D. Onglet Threads

- IV-E. Onglet Points d'arrêt

- IV-F. Onglet Sortie

- IV-G. Onglet Fenêtre Commande

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

- VI. Déboguer une fonction

- VII. Déboguer un trigger

- VIII. Remerciements

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.

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 :

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 :

Vous pouvez ajouter ou supprimer des points 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 :

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 :

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.

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 :

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).

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.

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.

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 :

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 :

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.

IV-F - Onglet Sortie

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

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 :

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

Afficher des informations sur les threads actuels :

>Debug.ListThreads   (puis appuyez sur Entrée)

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.

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 :

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 :

Une fois le mode débogage démarré, vous pouvez, à l'aide des boutons pas à pas détaillé, principale, etc. 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 ».

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 :

.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 :

Une fois le mode débogage démarré, vous pouvez, à l'aide des boutons pas à 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 ».

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.

-- 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 :

-- 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 :

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

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.