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.