Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/09/2011, 12h21   #1
Membre actif
 
Avatar de Peanut
 
Inscription : décembre 2003
Messages : 375
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 375
Points : 192
Points : 192
Par défaut [T-SQL] Erreur non "catchée" dans une transaction

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

Citation:
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
Peanut est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 15h36   #2
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 958
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 958
Points : 17 789
Points : 17 789
C'est normal, @@ERROR est réinitialisé à 0 à chaque ordre SQL. Si l'erreur survient au 1er delete, lors du 2e delete, si ce dernier passe bien @@ERROR vaut zéro et vous ne voyez rien venir...sœur Âne !

Voici donc une approche plus costaude...

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
CREATE PROCEDURE [dbo].[sps_DeleteI18N] 
	@I18N varchar(255)
AS
BEGIN
 
	BEGIN TRANSACTION
 
		DELETE FROM [DICTIONNAIRE_PAGE] WHERE [I18N] = @I18N;
		IF @@ERROR <> 0 GOTO LBL_ERROR;
 
		DELETE FROM [DICTIONNAIRE] WHERE [I18N] = @I18N
        IF @@ERROR <> 0 GOTO LBL_ERROR;
 
    COMMIT TRANSACTION
    PRINT 'OK';
    RETURN
 
LBL_ERROR:
	ROLLBACK TRANSACTION
	PRINT 'ROLLBACK ! '
	PRINT CAST(@@ERROR AS VARCHAR(10));
 
END
A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/09/2011, 15h50   #3
Membre actif
 
Avatar de Peanut
 
Inscription : décembre 2003
Messages : 375
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 375
Points : 192
Points : 192
Ah ok, je comprends, merci.
Peanut est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h51.


 
 
 
 
Partenaires

Hébergement Web