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 04/06/2008, 14h39   #1
Invité de passage
 
Inscription : mars 2005
Messages : 4
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 4
Points : 0
Points : 0
Par défaut Faire un ROLLBACK si des erreurs ou violations de contraintes

Salut,

J'ai une Transaction avec plusieurs instructions et je voudrais faire un ROLLBACK
s'il c'est passé une erreur ou si il y a eu une violation de contrainte, et je ne trouve pas comment faire.

Exemple :

BEGIN TRANSACTION trans;
INSERT INTO GROUPE (NUMGROUPE, NOMGROUPE) VALUES (1,'TEST'); -- ici violation PK --
INSERT INTO GROUPE (NUMGROUPE, NOMGROUPE) VALUES (12,'TEST');
IF @@ERROR <> 0 ROLLBACK TRANSACTION trans ELSE COMMIT;

En fait le @@ERROR ne fonctionne pas car il est seulement valide pour la dernière instruction. ici la première instruction me viole une contrainte de PK.
Mais la deuxième est bonne donc elle est enregistrée et @@ERROR = 0 donc COMMIT..

@@TOTAL_ERRORS ne fonctionne pas non plus lui il me dis toujours 0 quand je fais un print.

Puis pas question que je teste @@ERROR après chaque instruction car je peux en avoir 100000 ... (c'est un peu plus complexe que l'exemple forcément..)

Pour résumé si y a la moindre erreur dans la transaction je voudrai faire un ROLLBACK..

Merci!!!!
Smalo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/06/2008, 17h17   #2
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 959
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 959
Points : 17 792
Points : 17 792
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
BEGIN TRANSACTION
 
INSERT INTO GROUPE (NUMGROUPE, NOMGROUPE) VALUES (1,'TEST');
IF @@ERROR <> 0 
   GOTO LBL_ERROR
 
INSERT INTO GROUPE (NUMGROUPE, NOMGROUPE) VALUES (12,'TEST');
IF @@ERROR <> 0 
   GOTO LBL_ERROR
 
COMMIT TRANSACTION
RETURN
 
LBL_ERROR:
ROLLBACK TRANSACTION
Lisez les articles que j'ai écrit à ce sujet :
1) transaction et gestion des erreurs :
http://sqlpro.developpez.com/cours/s...nsactsql/#L4.6
2) transactions imbriquées :
http://sqlpro.developpez.com/cours/s...ns-imbriquees/

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 00
Vieux 05/06/2008, 11h37   #3
Invité de passage
 
Inscription : mars 2005
Messages : 4
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 4
Points : 0
Points : 0
ça ya pas de problème c'est ce que je fais en ce moment. mais comme je dis dans le sujet dans ma transaction je peux avoir 50000 instructions. Donc avec ça je suis obligé de mettre 50000 fois "IF @@ERROR <> 0 GOTO LBL_ERROR"..
Déja je trouve cela assez crade...
ce que je fais pour l'instant à la fiin de l'élaboration de la requète c'est ça :

Code :
1
2
3
4
5
6
7
 
// C#
REQUETE = REQUETE.REPLACE(";", ";if @@ERROR <> 0 GOTO LBL_ERROR;");
string debut = "BEGIN TRANSACTION trans;";
string fin = "COMMIT TRANSACTION trans; RETURN; LBL_ERROR: ROLLBACK TRANSACTION trans;";
REQUETE = debut + REQUETE + fin;
// ---
Cela fonctionne très bien mais ne me conviens pas pourquoi :

1 : Cela m'allonge le temps d'exécution de près de 35%!!!
2 : La requète est élaborée sur le client distant (internet ou local) d'un serveur d'application. Il y a donc téléchargement de la requète et avec 30% de taille en plus c'est 30% de temps de perdu en téléchargement
3 : c'est vraiment sale comme méthode et rien que ça ça me perturbe :p

ps : SQL SERVEUR 2000 donc pas de TRY CATCH

Merci!!
Smalo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2008, 14h10   #4
Invité de passage
 
Inscription : mars 2005
Messages : 4
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 4
Points : 0
Points : 0
Pour le deuxième point je le règle partiellement en faisant un deflate.. c'est déjà mieux pour le téléchargement. pour avoir un ordre d'idée 100000 lignes donc 50000 instruction + 50000 gestion d'erreur = 8M non compressé et 290k compressé.
Smalo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2008, 18h49   #5
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 959
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 959
Points : 17 792
Points : 17 792
En version 2000 c'est la seule méthode valable... Passez à 2005 !

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 00
Vieux 10/06/2008, 11h08   #6
Invité de passage
 
Inscription : mars 2005
Messages : 4
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 4
Points : 0
Points : 0
ouai j'y pense mais bon le problème c'est la migration des clients existants.. enfin.. ils auraient pu y penser avant..
merci de ta réponse
Smalo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h42.


 
 
 
 
Partenaires

Hébergement Web