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

MS SQL Server Discussion :

gestion d'erreur et de transactions....


Sujet :

MS SQL Server

  1. #1
    Dge
    Dge est déconnecté
    Candidat au Club
    Inscrit en
    Juillet 2002
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 4
    Points : 2
    Points
    2
    Par défaut [RESOLU] gestion d'erreur et de transactions....
    Bonjour a tous !

    Je travail sous SQL Server 7.0.
    J'ai une procedure stockée qui gère des enregistrement, j'ai plusieurs questions pour l'affiner :

    comment gérer les excepetions (erreurs..) ?
    Comment gérer les transactions afin d'éviter que plusieurs utilisateurs ne la sollicite en même temps ?

    merci de votre aide :o)

    pour info voici ma procedure :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    CREATE  PROCEDURE  sp_Personnel
     
    @NUMMAT as char(4),
    @DEP_ID as char(4),
    @NOM as char(30),
    @PRENOM as char(15),
    @ctrl as nvarchar(1) out
     
    AS
     
    if (@ctrl = 'W')
    begin
            IF NOT EXISTS (SELECT NUMMAT
                                       FROM PERSONNEL
                                     WHERE NUMMAT = @NUMMAT)
            begin
                    INSERT INTO PERSONNEL(NUMMAT ,DEP_ID ,NOM ,PRENOM)
                    VALUES (@NUMMAT ,@DEP_ID ,@NOM ,@PRENOM);
                    set @ctrl = 'I'
             end
             else
             begin
                     UPDATE PERSONNEL
                           SET DEP_ID = @DEP_ID,
                                 NOM = @NOM,
                                 PRENOM = @PRENOM
                      WHERE NUMMAT = @NUMMAT;
                      set @ctrl = 'U'
             end
         end
    else
    begin
            DELETE FROM PERSONNEL
            WHERE NUMMAT = @NUMMAT;
            set @ctrl = 'D'
    end 
     
    GO
    l'inutile n'est agréable que s'il est bien utilisé

  2. #2
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 222
    Points : 19 551
    Points
    19 551
    Billets dans le blog
    25
    Par défaut Re: gestion d'erreur et de transactions....
    Citation Envoyé par Dge
    comment gérer les excepetions (erreurs..) ?
    avec raiserror, return et test du code retour

    Citation Envoyé par Dge
    Comment gérer les transactions afin d'éviter que plusieurs utilisateurs ne la sollicite en même temps ?
    T'inquiète : SQL-Server et ses verrous s'en charge !

    Ex bête, mais c'est juste pour démontrer les mécanismes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    create proc tst (@v varchar(30))
    as
    begin
    insert into maTable values(@v)
    if @@error <> 0
       begin
       raiserror 20001 "Erreur lors de l'insertion"
       return -1
       end
    else
       return 0
    end
    Puis l'appel avec le test

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    begin tran
    declare @ret int
    exec @ret = tst myChaine
    if @ret <> 0
        rollback tran
    else
       commit
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

  3. #3
    Dge
    Dge est déconnecté
    Candidat au Club
    Inscrit en
    Juillet 2002
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    ok !
    mais aurais tu un exemple pour les raiserror, return, et code retour ?
    l'inutile n'est agréable que s'il est bien utilisé

  4. #4
    Dge
    Dge est déconnecté
    Candidat au Club
    Inscrit en
    Juillet 2002
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    oups oups oups !!!

    désolé, j'ais eu un problème d'affichage, j'avais pas vu la suite ....

    Merci !!
    l'inutile n'est agréable que s'il est bien utilisé

  5. #5
    Candidat au Club
    Inscrit en
    Octobre 2002
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Dans le cas où on a une erreur sévère, (severity=16 state=1), le code est interrompu. Si on est dans une procédure stockée appelée par une autre, on revient avec @@error = 0.

    Comment faire pour récupérer le bon code erreur ?

    alain
    alain

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    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 766
    Points : 52 563
    Points
    52 563
    Billets dans le blog
    5
    Par défaut
    tout cela est décrit dans le paragaphe 3.3 Gestion des erreurs
    de la page :
    http://sqlpro.developpez.com/Transac...ansactSQL.html

    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/ * * * * *

  7. #7
    Dge
    Dge est déconnecté
    Candidat au Club
    Inscrit en
    Juillet 2002
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 4
    Points : 2
    Points
    2
    Par défaut [RESOLU]
    Ok merci !
    l'inutile n'est agréable que s'il est bien utilisé

  8. #8
    Candidat au Club
    Inscrit en
    Octobre 2002
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Je me permets d'insister car le chapitre 3.3 décrit le traitement des erreurs "récupérables".

    extrait :
    Pour les exceptions plus flagrantes, SQL Server fournit la variable globale @@error que l'on peut tester à tout instant. Cette variable est mise à jour à chaque instruction.

    Le code continue de s'exécuter même après une erreur.


    J'ai bien spécifié le cas : (severity=16 state=1), le code est interrompu. Si on est dans une procédure stockée appelée par une autre, on revient avec @@error = 0.

    alain
    alain

  9. #9
    Nouveau membre du Club
    Inscrit en
    Mars 2003
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 39
    Points : 37
    Points
    37
    Par défaut
    voila ta réponce:

    http://www.developpez.net/forums/vie...91552f2455c7e1

    c'est le paramétre NoCount qu'il faut passer à ON.

  10. #10
    Nouveau Candidat au Club
    Inscrit en
    Février 2006
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 1
    Points : 1
    Points
    1
    Par défaut sql error
    Bonjour,

    J'ai un peu le problème inverse de tout le monde et j'arrive pas a trouver quoi que ce soit ...
    la gestion d'erreur ne me pose aucun problème mais je voudrais pouvoir recuperer le message de la table sysmessages

    Exemple
    La table sysmessages me renvoit un message de la forme
    Violation de la contrainte %1! '%2!'. Impossible d'insérer une clé en double dans l'objet '%4!'.

    Violation de la contrainte PRIMARY KEY 'PK_Table'. Impossible d'insérer une clé en double dans l'objet 'Table'.
    L'instruction a été arrêtée.

    Donc ma question est d'arriver à pouvoir remplacer les % par les vrais valeurs que je ne connais pas obligatoirement suivant l'erreur
    j'ai essayé via raiserror ou formatmessage mais aucune des 2 ne peut le faire et j'ai rien trouvé de mieux.

    La seule que j'ai reussi a faire, c'est d'avoir la ligne de sysmessage via l'error et l'id langue .. mais je ne sais pas a quoi cela est rattaché, donc c'est une erreur souvent inutile si on ne peut pas la replacer dans le contexte surtout dans des procs stock faisant quelques lignes de traitements

    Est ce quelqu'un aurait une réponse ?.
    Merci beaucoup

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

Discussions similaires

  1. gestion des erreurs dans une transaction mysql
    Par ytoutou dans le forum Requêtes
    Réponses: 3
    Dernier message: 17/12/2010, 23h21
  2. Réponses: 0
    Dernier message: 07/04/2010, 16h39
  3. Gestion des transactions - Gestion des erreurs
    Par devdev dans le forum MS SQL Server
    Réponses: 14
    Dernier message: 23/03/2005, 20h17
  4. [LG]tests pour la gestion d'erreur
    Par le 27 dans le forum Langage
    Réponses: 3
    Dernier message: 22/12/2003, 20h44
  5. [LG]gestion des erreurs
    Par frontin dans le forum Langage
    Réponses: 3
    Dernier message: 29/11/2003, 22h41

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