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 :

[SQL2K5][T-SQL] Accès a INSERTED dans un CATCH


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 [SQL2K5][T-SQL] Accès a INSERTED dans un CATCH
    Bonjour,

    J'ai un trigger sur une table, qui, s'il y'a une erreur, fait le traitement suivant:

    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
    BEGIN CATCH
    		ROLLBACK TRANSACTION;
     
    		DECLARE @MAIL_MSG VARCHAR(1024);
    		SET @MAIL_MSG = ERROR_MESSAGE() + '<br><br>';
    		EXEC msdb.dbo.sp_send_dbmail @profile_name = 'monProfil',
    						@recipients = gringo@gringo.com',
    						@subject = 'monTrigger',
    						@body = @MAIL_MSG,
    						@query = 'SELECT IDMESSAGE, IDPARENT, IDCUSTOMER, IDBILLINGSTATUS, IDOPERATORRESPONSE FROM INSERTED;',
    						@query_result_separator = ',',
    						@body_format = 'HTML';
     
    		SET @MAIL_MSG = 'TR_AIU_SMSSENT_FAST : ' + REPLACE(@MAIL_MSG, '<br>', '');
    		RAISERROR(@MAIL_MSG, 16, 1);
    END CATCH;
    Or quand une erreur se produit, SQL Server me retourne l'erreur suivante:

    Msg 22050, Level 16, State 1, Line 0
    Error formatting query, probably invalid parameters
    Msg 14661, Level 16, State 1, Procedure sp_send_dbmail, Line 478
    Query execution failed: Msg 208, Level 16, State 1, Server SQL, Line 1
    Invalid object name 'INSERTED'.

    Pourquoi n'est-il pas possible d'accéder à INSERTED dans le CATCH ?

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Par défaut
    Je pense que cela vient de ton rollback. Une fois le rollback effectué la commande est annulée donc la table INSERTED est vidée.
    Essaie de faire la même commande mais en plaçant ton rollback à la fin de ton bloc catch.

    Cela marchera peut-être ?
    DOnne nous des nouvelles ?

  3. #3
    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
    Salut Madinico,

    Merci de ta réponse.
    En fait quelle que soit la place du ROLLBACK dans le bloc CATCH, j'ai rien.
    J'ai essayé ceci:

    - Mettre dans une variable table le SELECT de INSERTED puis sélectioner ma variable table
    - Mettre dans une table temporaire locale le SELECT de INSERTED puis sélectioner ma table temporaire
    - Mettre dans une table temporaire globale le SELECT de INSERTED puis sélectioner ma table globale

    Y'a rien à faire

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Par défaut
    Il y a alors une seule solution au fait de ce comportement. Ta requête d'update n'affectant aucune ligne de ta table, les tables INSERTED et DELETED sont forcément vide.

    Essaye tout d'abord de sélectionner les enrgistrements que tu souhaites modifier. Si ta requête de sélection te renvoie des enregistrement alors essaye le process suivant.

    Au tout début du trigger : charger une table temporaire locale avec ta table INSERTED. Puis continuer ton traitement. Si tu passes dans le catch utilise ta table temporaire locale.

  5. #5
    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
    Salut,

    Si le trigger se déclenche, c'est que j'ai tenté d'insérer la table sur laquelle il est, donc INSERTED ne peut pas être vide.
    Pour l'instant je ne fais que tester ce trigger. Je l'ai testé sur des insertions dont je savais qu'elles fonctionneraient et ça a parfaitement fonctionné.
    La transaction qui lève cette erreur est une erreur sur une vérification de contrainte de clé étrangère, que j'ai volontairement introduite pour tester les erreurs.

    J'ai essayé de mettre les caractéristiques du message dans une variable table et dans une table temporaire locale avant de faire le BEGIN TRY; BEGIN TRANSACTION mais il n'y a rien à faire :
    - dans le cas de la variable table, j'ai Invalid object name @maTable
    - dans le cas de la table temporaire locale, celle-ci est bien créée mais n'est pas insérée

  6. #6
    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,

    Dois-je en conclure que ce n'est pas possible ?

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/09/2008, 10h15
  2. [SQL] problème d'insertion dans ma base ou problème de requête sql
    Par maroco31 informatik dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 06/06/2007, 08h16
  3. sql update et insert dans la meme requete
    Par Jessicaa dans le forum Langage SQL
    Réponses: 8
    Dernier message: 14/12/2005, 15h39
  4. Insertion dans table SQL server (Trigger) Aidz moi SVP????
    Par pop bob dans le forum Développement
    Réponses: 2
    Dernier message: 30/07/2005, 23h55
  5. uniqueidentifier et INSERT dans MS-SQL
    Par Dlfine dans le forum MS SQL Server
    Réponses: 11
    Dernier message: 12/08/2004, 11h29

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