Salut,
j'ai une procédure stockée toute bête dans laquelle j'essaye de faire une gestion d'erreur basique mais je n'arrive pas à "catcher" l'erreur :
La table DICTIONNAIRE contient un champ clé étrangère de DICTIONNAIRE_PAGE, donc il faut supprimer en 1er dans DICTIONNAIRE.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 CREATE PROCEDURE [dbo].[sps_DeleteI18N] @I18N varchar(255) AS BEGIN BEGIN TRANSACTION DELETE FROM [DICTIONNAIRE_PAGE] WHERE [I18N] = @I18N DELETE FROM [DICTIONNAIRE] WHERE [I18N] = @I18N IF @@ERROR <> 0 BEGIN ROLLBACK TRANSACTION PRINT 'ROLLBACK ! ' PRINT CAST(@@ERROR AS VARCHAR(10)); END ELSE BEGIN COMMIT TRANSACTION PRINT 'OK'; END END
J'ai volontairement inversé le bon ordre des 2 DELETE pour provoquer l'erreur afin de vérifier le code.
Je m'attends à ce que le rollback soit fait et en fait je passe dans le commit ! (avec le 2e DELETE qui s'exécute correctement)
Msg*547, Niveau*16, État*0, Procédure*sps_DeleteI18N, Ligne*18
L'instruction DELETE est en conflit avec la contrainte REFERENCE "FK_DICTIONNAIRE_DICTIONNAIRE_PAGE". Le conflit s'est produit dans la base de données "PARAD", table "dbo.DICTIONNAIRE", column 'I18N'.
L'instruction a été arrêtée.
(3*ligne(s) affectée(s))
OK
Partager