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

Développement SQL Server Discussion :

TRY CATCH , La transaction actuelle ne peut pas être validée [2008]


Sujet :

Développement SQL Server

  1. #1
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Septembre 2003
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Septembre 2003
    Messages : 399
    Points : 259
    Points
    259
    Par défaut TRY CATCH , La transaction actuelle ne peut pas être validée
    Bonsoir,

    Dans un trigger en faisant un try catch, je voulais dans le CATCH, insérer le message d'erreur dans une table pour lire plus tard.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
                    BEGIN TRY
    			Insert INTO BASE1..MA_TABLE(MonChamp1, MonChamp2)
    	 		SELECT 'A' as MonChamp1 , 'B' as MonChamp2
    	 		FROM INSERTED S WHERE S.champ3=1
    	 	END TRY
    	 	BEGIN CATCH
    	 		INSERT INTO [BASE2]..[Erreurs] () VALUES ('mon message erreur') 
    	 	END CATCH
    j'ai le message d'erreur ci-desssous qui se produit lors de l'insert qui se trouve dans le CATCH (j'ai fait un pas à pas pour le savoir)

    La transaction actuelle ne peut pas être validée et ne prend pas en charge les opérations qui écrivent dans le fichier journal. Restaurez la transaction.

    Malgré des recherches sur le net je comprend pas d'où vient le problème ?


    Merci

  2. #2
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Hello,

    Le trigger se déclenche dans le contexte de la transaction implicite de la commande qui l'appelle. Donc tu es dans une transaction.
    Ton deuxième INSERT se produit à un moment où la transaction n'est plus validable à cause de l'erreur, donc il ne sert à rien de toute façon : l'insertion ne pourra pas se faire.
    Ajoute un ROLLBACK juste avant. Cela va déclencher l'exception 3609 : "La transaction s'est terminée dans le déclencheur. Le traitement a été abandonné.", mais le message d'erreur originel sera loggué dans ta table d'erreurs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    BEGIN TRY
        Insert INTO BASE1..MA_TABLE(MonChamp1, MonChamp2)
        SELECT 'A' as MonChamp1 , 'B' as MonChamp2
        FROM INSERTED S WHERE S.champ3=1
    END TRY
    BEGIN CATCH
        ROLLBACK
        INSERT INTO [BASE2]..[Erreurs] () VALUES ('mon message erreur') 
    END CATCH
    Exemple :
    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
    USE tempdb;
    GO
     
    CREATE TABLE coco (c varchar(10))
    CREATE TABLE mama (c varchar(10))
    GO
     
    CREATE TRIGGER atr_coco
    ON coco
    AFTER INSERT
    AS BEGIN
    BEGIN TRY
        Insert INTO mama
        SELECT 'qsfsfqsfqsfsqfqsfsqdfsqfsfd'
        FROM INSERTED S
    END TRY
    BEGIN CATCH
        ROLLBACK
        INSERT INTO mama VALUES ('hum') 
    END CATCH
    END
    GO
     
    INSERT INTO coco VALUES ('rr')
     
    SELECT * FROM mama
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  3. #3
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Septembre 2003
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Septembre 2003
    Messages : 399
    Points : 259
    Points
    259
    Par défaut
    Merci pour ton aide, avec tes explications, ça marche, parfait

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 18/05/2009, 19h15
  2. la mémoire ne peut pas être "written"
    Par zouzou1949 dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 17/12/2006, 14h16
  3. Mémoire ne peut pas être read
    Par tedparker dans le forum Access
    Réponses: 4
    Dernier message: 27/09/2006, 11h54
  4. Liens URL : La mémoire ne peut pas être "read" ?
    Par fredfred dans le forum Windows XP
    Réponses: 4
    Dernier message: 28/07/2006, 08h48
  5. Réponses: 6
    Dernier message: 03/09/2003, 10h29

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