|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 062 ![]() |
Salut,
J'ai une PS qui fait un certain nombre de traitements dans un bloc de transaction : Code :
Je voudrais, sans devoir mettre un test à chaque ligne succeptible de planter : - Faire un rollback de ma transaction, puisque je suis dans une transaction et qu'elle est mal passée - Sortir de ma procédure Je pensais qu'une erreur non récupérée par un TRY CATCH allait produire ce comportement. Avec une sévirité de 1, le traitement continuait comme si de rien n'était. Avec une sévérité de 11, la traitement s'interromp dans la procédure (ici le trigger) mais continue normalement dans le bloc appelant. Je ne voudrais pas en arriver à l'extrême sévérité 25, qui stoppe la connexion SQL. Je ne trouve pas de documentation qui décrive chaque niveau de sévirité 1 à 1. Dois-je utiliser autrechose pour arriver à mes fins ? |
||
|
|
00
|
|
|
#2 | ||
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 062 ![]() |
Est-ce que d'après vous, ce code fait ce que je cherche à faire ?
Code :
|
||
|
|
00
|
|
|
#3 | |||
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 959 ![]() |
Citation:
A lire : http://www.sommarskog.se/error-handling-I.html paragraphe "More on Severity Levels" Mais la solution que vous donnez est fausse car on ne sait pas si la transaction est encore ouverte dans la partie CATCH (elle peut avoir été annulée dans le trigger !) Pour savoir quoi faire, utilisez la fonction XACT_STATE() : Code :
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 * * * * * |
|||
|
00
|
|
|
#4 |
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 062 ![]() |
D'accord.
La severity 11, c'était effectivement de moi. J'ai trouvé entre temps qu'il vallait mieux mettre 16 (sans trop savoir pourquoi). Ceci dit, cela n'a rien changé au comportement du programme. OK pour votre solution. En revanche, ma question reste ouverte quant à la faisabilité du comportement suivant : Procédure A crée transaction Procédure A modifie des lignes Procédure A déclenche trigger B Trigger B crée une transaction Trigger B exécute des oppérations Trigger B plante "Vrai plantage". => Rollback implicite de trigger B => Arrêt immédiat de trigger B à l'endroit où l'erreur a été levée => Rollback implicite de procédure A => Arrêt immédiat de procédure A à l'endroit où l'erreur a été levée => (éventuellement, bouillonnement des rollback/arrêt immédiat au niveau des procédures appelantes) En gros, je cherche à reproduire ce qui se passerait avec un RAISERROR avec une sévérité de 25, mais en conservant la connexion ouverte. => En gros, je cherche a reproduire la notion d'exception comme elle existe dans les langages type C/C++/C# : on plante tous les traitements jusqu'à ce qu'il y en ait un qui trappe proprement l'erreur. Joint avec la notion de transaction, cela me permettrait de proprement revenir à l'état initial de mon instruction appelante, sans avoir à gérer des bouillonnements d'erreur et des imbrications de transactions à la main à tous les niveaux. |
|
|
00
|
|
|
#5 | |
|
Membre Expert
![]() |
Citation:
Qu'appelez vous des "bouillonnements d'erreur"?
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
|
|
|
00
|
|
|
#6 | |
![]() ![]() Administrateur de base de données Inscription : août 2007 Messages : 1 159 ![]() |
Citation:
http://msdn.microsoft.com/en-us/library/ms164086.aspx |
|
|
|
00
|
|
|
#7 | |
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 062 ![]() |
Citation:
Je désire que l'instruction qui a délenché le trigger qui a planté soit en erreur elle aussi. Et ainsi de suite : si cette instruction est dans une fonction, alors je veux que la fonction soit en erreur, et que la requête appelante soit en erreur. => Jusqu'à ce que j'arrive à un bloc try/catch qui gère convenablement l'erreur, ou jusqu'à ce que dans mon programme appelant. Ainsi, si depuis mon programme j'appelle une procédure stockée, qui lance une fonction, qui délenche un trigger, qui exécute une ps qui lance une fonction, etc. etc. etc. plante, alors je veux que si je n'ai aucune gestion d'erreur, la procédure appelé par mon programme retourne l'erreur à mon programme et s'arrête là où il y a eu l'erreur. Exactement de la même façon que se comporte un programme classique (C, ADA, VB, Java...). En effet, je désire déporter au maximum les traitements de données dans des PS/Fonctions SQL, mais pour se faire, j'ai besoin d'avoir un minimum de mécanismes intelligents. Ce qui m'étonne, c'est que contraitement à SQL Server, Oracle fonctionne bel et bien comme ça : dès qu'une intruction plante, l'erreur est propagée à tous les niveaux et plante tous les traitements appelant s'ils ne gèrent pas l'erreur proprement. SQL Serveur se contente de continuer les traitements appelant, sans se soucier une seconde de l'intégrité du traitement. |
|
|
|
00
|
|
|
#8 | ||||
|
Membre chevronné
![]() ![]() |
Citation:
Citation:
Citation:
Citation:
Vous me direz vos conclusions car je fais des recherches sur les "erreur" avec TSQL. Merci d'avance.
__________________
Le monde est trop bien programmé pour être l’œuvre du hasard… |
||||
|
10
|
Copyright © 2000-2012 - www.developpez.com