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 :

Triggers : Utilisation Try Catch


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 71
    Par défaut Triggers : Utilisation Try Catch
    Bonjour à toutes et tous,

    Tout d'abord je tiens à préciser que ce que je fais n'est certainement pas le plus propre dans l'esprit...D'autant plus que mes compétences en SQL Server sont pour le moins "intermédiaires"...

    Néanmoins mon analyse et le fait que je n'ai pas la main sur tout dans la base de données qui est principalement utilisée pour le fonctionnement d'un logiciel (Sage Gestion Commerciale) m'amène a vouloir effectuer un DELETE lorsqu'une erreur est rencontrée et donc dans le Catch.

    Plus exactement, afin que l'utilisateur de Gestion Commerciale ait un message à l'écran, je me dois de lancer un RAISERROR. En gros je détecte que l'utilisateur a oublié telle ou telle saisie, donc je lance un RAISERROR pour l'avertir qu'il manque une info. Mais si je ne lance pas à la suite un DELETE de la ligne en cours, lorsque l'utilisateur fera sa correction dans sa facture, la ligne sera présente en double (c'est tellement bien développé...)

    Si je met ce fameux DELETE avant le RAISERROR, rien ne se passe : je comprends donc qu'un RAISERROR annule de fait les instructions du Trigger et passe dans le Catch (ce qui en soit me semble parfaitement logique), sauf que si je lance le DELETE dans le Catch, j'obtient le message "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."

    Il semble donc que toute action journalisée ne soit pas exploitable dans un bloc Catch : je me retrouve donc dans l'impasse...

    Je vous copie le script de mon trigger, bien qu'il soit sans doute abstrait sans avoir tous les tenants et aboutissants :

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
    /****** Object:  Trigger [dbo].[APX_TG_UPD_F_DOCLIGNE_IL]    Script Date: 04/15/2013 15:55:25 ******/
    SET ANSI_NULLS ON
    GO
     
    SET QUOTED_IDENTIFIER ON
    GO
     
    CREATE TRIGGER [dbo].[APX_TG_UPD_F_DOCLIGNE_IL] ON [dbo].[F_DOCLIGNE] FOR UPDATE AS 
    BEGIN
     
    		SET NOCOUNT ON;
     
    BEGIN TRY
     
    IF EXISTS(SELECT 'a' FROM INSERTED WHERE AR_Ref IN ('A_MCO','A_PRD','A_PMD'))
    BEGIN		
    	DECLARE @dopiece varchar(9);
    	DECLARE @ligne int;
    	DECLARE @ligneEnCours int;
     
    	SET @dopiece = (SELECT DO_Piece FROM inserted);
     
    	IF EXISTS(SELECT TOP 1 DL_Ligne FROM APX_TG WHERE DO_Piece = @dopiece)
    	SELECT DL_Ligne INTO #tmp FROM APX_TG WHERE DO_Piece = @dopiece;
     
     
     
     
    	SET @ligneEnCours = (SELECT DL_Ligne FROM INSERTED)
     
    IF UPDATE(Profil_Type)
    OR UPDATE(Nb_Jours)
    OR UPDATE(Prix_de_vente_journalier)
    BEGIN
    	IF ((SELECT ISNULL(Profil_Type,'NULL') FROM inserted) = 'NULL')
    	OR ((SELECT Nb_Jours FROM inserted) = 0)
    	OR ((SELECT Prix_de_vente_journalier FROM inserted) = 0)
    	BEGIN
     
     
     
     
     
    		RAISERROR(82045,11,1);
     
     
    	END
    	ELSE
    	BEGIN
    		IF EXISTS(SELECT TOP 1 DL_Ligne FROM APX_TG WHERE DO_Piece = @dopiece)
    		BEGIN
     
    		DELETE FROM F_DOCLIGNE WHERE DO_Piece = @dopiece AND DL_Ligne IN (SELECT DL_Ligne FROM #tmp) AND DL_Ligne <> @ligneEnCours;
    		DELETE FROM APX_TG WHERE DO_Piece = @dopiece;
    		END
    	END
    	END
     
    END;
     
    END TRY
    BEGIN CATCH
    		DELETE FROM F_DOCLIGNE WHERE DO_Piece = @dopiece AND DL_Ligne IN (SELECT DL_Ligne FROM APX_TG WHERE DO_Piece = (SELECT DO_Piece FROM inserted));
     
    		DELETE FROM APX_TG WHERE DO_Piece = (SELECT DO_Piece FROM inserted) ;
     
     
        DECLARE @ErrorMessage NVARCHAR(4000);
        DECLARE @ErrorSeverity INT;
        DECLARE @ErrorState INT;
     
        SELECT @ErrorMessage = ERROR_MESSAGE(),
               @ErrorSeverity = ERROR_SEVERITY(),
               @ErrorState = ERROR_STATE();
     
        -- Use RAISERROR inside the CATCH block to return 
        -- error information about the original error that 
        -- caused execution to jump to the CATCH block.
        RAISERROR (@ErrorMessage, -- Message text.
                   @ErrorSeverity, -- Severity.
                   @ErrorState -- State.
                   );
    END CATCH;
     
     
    END;
     
     
     
     
    GO
    Finalement le souci réside principalement dans le fait que je suis obligé de trouver un moyen d'annuler ce que fait le logiciel sans avoir accès à un ROLLBACK...

    Fais-je totalement fausse route ? Avez vous des suggestions ?

    Merci beaucoup pour vos réponses !!

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 71
    Par défaut
    Personne n'a aucune idée ? Ou suis-je si confus dans mes explications ?

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    je n'ai pas compris pourquoi ne voulez-vous pas faire de rollback ?

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Au passage votre déclencheur n'est pas ensembliste, donc il faut le corriger

    @++

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 71
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Bonjour,

    Au passage votre déclencheur n'est pas ensembliste, donc il faut le corriger

    @++
    J'en prends bonne note, je vais consulter ça

  6. #6
    Membre Expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Billets dans le blog
    8
    Par défaut
    Salut
    Une question: Le RAISERROR dans TRY, fait-il passer l'exécution dans le CATCH du même TRY?
    Pour le problème d'annulation, je pense qu'il faut juste ROLLBACK avant RAISERROR.
    @+

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 71
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Bonjour,

    je n'ai pas compris pourquoi ne voulez-vous pas faire de rollback ?
    Ce n'est pas tant que je ne veux pas en faire, c'est que le ne peux pas. Ou en tout cas je pense que je ne le peux pas.

    Comment lanceriez vous un rollback sur une transaction effectuée préalablement par un logiciel, qui a donné lieu au déclenchement du trigger ?
    (Excusez ma question si elle parait bête...)

  8. #8
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Citation Envoyé par nico1492 Voir le message
    Ce n'est pas tant que je ne veux pas en faire, c'est que le ne peux pas. Ou en tout cas je pense que je ne le peux pas.
    Ok je comprends mieux.
    Dans ce cas, faites un rollback dans votre catch, au tout début (avant les DELETE)

Discussions similaires

  1. [2012] Problème avec l'utilisation de TRY/CATCH à l'intérieure d'un trigger
    Par Fog-Thunder dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 12/02/2014, 09h20
  2. [T-SQL 2k5] Utilisation Try Catch
    Par Lyche dans le forum Développement
    Réponses: 2
    Dernier message: 21/10/2009, 16h28
  3. [C#] Comment bien utiliser des TRY CATCH
    Par UNi[FR] dans le forum C#
    Réponses: 5
    Dernier message: 14/11/2007, 19h20
  4. trigger et try catch
    Par mohamed dans le forum Développement
    Réponses: 3
    Dernier message: 24/08/2007, 16h42
  5. Utilisation try catch
    Par LinuxUser dans le forum Langage
    Réponses: 5
    Dernier message: 16/05/2007, 13h14

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