IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Procédural MySQL Discussion :

Récupération d'exceptions dans un script


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Récupération d'exceptions dans un script
    Bonjour à tous.

    Dans ma quête pour comprendre le SQL et l'utiliser correctement je viens de tomber sur un os.

    Mettons que je doive écrire un long script qui fait des modifications dans mes tables (pas un simple SELECT donc). Le problème c'est qu'on est jamais sûr que notre script est exempt d'erreurs (erreur de frappe, mauvaise orthographe d'un champ, etc.). Or si une exception est levée en plein milieu du script celui-ci aura déjà été partiellement exécuté.
    On va alors se retrouver avec une base complètement inconsistante et il faudra déterminer quelle requête est fautive pour réécrire un nouveau script ad hoc pour exécuter les requêtes qui ne l'ont pas été. Lequel nouveau script contiendra sans doute des erreurs de frappe, ce qui oblige à recommencer cette opération fastidieuse à chaque problème.

    Existe-t-il donc un moyen de retrouver l'état initial de la base au cas où une exception survient au cours du script afin de pouvoir corriger simplement le script et l'exécuter à nouveau, sans avoir à en écrire un autre ?

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 998
    Billets dans le blog
    6
    Par défaut
    Existe-t-il donc un moyen de retrouver l'état initial de la base au cas où une exception survient au cours du script afin de pouvoir corriger simplement le script et l'exécuter à nouveau, sans avoir à en écrire un autre ?
    Oui, cela s'appelle une transaction. Lisez ce sue j'ai écrit à ce sujet :
    http://sqlpro.developpez.com/cours/sqlaz/techniques/#L1

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci pour la réponse.

    J'ai orienté mes recherches sur les transactions, mais ça n'a pas l'air de marcher...

    Note : J'utilise MySQL version 5.0 avec le moteur InnoDB (qui supporte donc les transactions).

    Quand j'exécute un script contenant une erreur (en utilisant la console), j'observe que seule la requête fautive est annulée et l'exécution du script continue jusqu'à la fin.
    L'occurrence d'une erreur ne provoque donc pas la fin de la transaction et le rollback que j'attendais.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    START TRANSACTION;
     
    REQUETE 1;
     
    REQUETE 2;
     
    ...
     
    COMMIT;
    J'ai aussi vu à plusieurs endroit des personnes suggérer d'utiliser une variable de MySQL : autocommit. Mais même en faisant
    en début de code ça ne change rien.
    D'ailleurs je ne comprend pas bien l'intérêt de faire ça vu qu'une transaction est justement censée empêcher le commit à la fin de chaque requête et ne commiter qu'à la fin... Me trompe-je ?

    Si la solution nécessite d'utiliser des techniques propres à MySQL et plus les fonctionnalités SQL pur je veux bien déplacer mon post, mais ça me semble bizarre que la récupération des erreurs ne soit pas prévue dans la spécification de base du SQL.
    Dernière modification par Invité ; 30/12/2008 à 11h39.

  4. #4
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 74

    Informations forums :
    Inscription : Octobre 2006
    Messages : 124
    Par défaut
    Bonjour,
    Cela peut paraitre idiot comme question, mais vos tables concernées sont bien de type Innodb et non myisam ?
    Cordialement
    MS

  5. #5
    Invité
    Invité(e)
    Par défaut
    Oui ce sont bien des InnoDB (je l'avais précisé au milieu de mon deuxième post )

  6. #6
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 74

    Informations forums :
    Inscription : Octobre 2006
    Messages : 124
    Par défaut
    Bonjour,
    Cela semble étonnant.
    Pourriez vous donner vos dessins de table et les requêtes utilisées.
    Passez de bonnes fêtes.
    Cordialement
    MS

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Try/Catch récupération message erreur dans script
    Par rikemSen dans le forum BODI
    Réponses: 4
    Dernier message: 03/04/2017, 16h45
  2. Récupération d'une variable PHP dans mon script JS
    Par dojbouli dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 21/04/2013, 12h52
  3. Réponses: 0
    Dernier message: 13/09/2010, 09h27
  4. Réponses: 0
    Dernier message: 03/04/2008, 09h18
  5. Réponses: 2
    Dernier message: 28/08/2003, 00h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo