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 :

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
La table DICTIONNAIRE contient un champ clé étrangère de DICTIONNAIRE_PAGE, donc il faut supprimer en 1er dans DICTIONNAIRE.

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