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 :

Executer une procédure stockée avant un trigger (débutant)


Sujet :

MS SQL Server

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 252
    Points : 192
    Points
    192
    Par défaut Executer une procédure stockée avant un trigger (débutant)
    Bonjour
    Voici donc mon problème (encore) avec triggers
    J'ai donc à peut près compris le principe du trigger, mais j'ai un souci.
    Je souhaite toujours savoir si un tuple existe pour le mettre à jour, sinon je renvoi une valeur de retour à l'utilisateur.
    Mon souci vient que la procédure stockée n'est pas exécuté, et le champ, existant ou pas n'est pas mi à jour, j'ai donc toujours mon message d'erreurs.
    Voici mes bouts de code, avec le déroulement pas à pas...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    --Je veux mettre ici un tuple qui existe avec la procédure stockée spupdateAffaire, aucun souci normalement
    DECLARE	@return_value int
     
    EXEC	@return_value = [dbo].[spUpdateAffaire]
    		@id = 2,
    		@name = N'6565',
    		@comments = N'4564654',
    		@dateCreation = N'10/10/2010'
     
    SELECT	'Return Value' = @return_value
     
    GO
    Voici la procédure stockée spupdateAffaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    CREATE PROCEDURE spUpdateAffaire
    	@id int,
    	@name varchar(50),
    	@comments varchar(max),
    	@dateCreation datetime
    AS
    BEGIN
    	--La procédure stockée arrive sur la premiere ligne, et la je vais directement sur le trigger sans executer la procédure stockée, ce qui n'est bien sur pas le cas que je veux faire...
    	UPDATE AFFAIRE
    	SET AffaireName=@name, AffaireComments=@comments, AffaireDateCreation=@dateCreation
    	WHERE AffaireId=@id
    END
    Enfin, voici mon trigger

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE TRIGGER [dbo].[Test_Exist] ON [dbo].[AFFAIRE]
    INSTEAD OF UPDATE--J'ai essayé Instead Of, For et Before....
    AS
    BEGIN
    IF (COLUMNS_UPDATED() & 14 ) > 0 --La c'est si les 3 champs sont modifiés
    RAISERROR (N'SpupdateAffaire', 10, 1, 15000, 0);
    ROLLBACK TRANSACTION
    END
    Mon souci vient qu'a aucun moment, je peux mettre à jour mon tuple vu que je sors de la procédure avant....
    Merci d'avance

  2. #2
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Bonjour

    Je ne comprends pas très bien :

    - tu as une PS qui effectue une mise à jour
    - tu as un trigger INSTEAD OF qui vise à empêcher cette mise à jour (qui donc ne peut pas avoir lieu, mais sans lever d'erreur, et qui lève une erreur dans certaines conditions, mais dans tous les cas, la mise à jour est bloquée).

    Donc, pourquoi n'utilises tu pas un TRIGGER 'AFTER' en lieu et place du TRIGGER 'INSTEAD OF' ?

    En effet, avec un TRIGGER 'AFTER', comme le trigger s'éxécute dans le contexte transactionnel de la PS, le ROLL BACK provoquera l'abandon de la mise à jour sous condition et la laissera s'effectuer dans les autres cas.

    Autre question : pourquoi utilises tu à la fois le ROLLBACK et le RAISEERROR ? tu souhaites avoir une trace dans les logs et/ou un retour au niveau de l'application cliente ?

    Par ailleurs ton ROLLBACK est fait systématiquement, et ton RAISERROR conditionnellement; bref, j'avoue ne pas bien comprendre ce que tu veux faire à la lecture de ton code.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 252
    Points : 192
    Points
    192
    Par défaut
    En fait ce que je compte faire de manière simple, c'est faire une mise à jour d'un tuple si celui-ci existe, sinon je souhaite remonter un code d'erreur (peut importe dans que je le remonte, je le récupère ensuite en c#)
    En fait je débute avec les triggers (stagiaire toussa ).
    J'ai tester comme je les dis avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE TRIGGER [dbo].[Test_Exist] ON [dbo].[AFFAIRE]
    AFTER UPDATE
    AS
    BEGIN
    IF (COLUMNS_UPDATED() & 14 ) > 0 --La c'est si les 3 champs sont modifiés
    RAISERROR (N'SpupdateAffaire', 10, 1, 15000, 0);
    END
    Mais celui ci arrive toujours dans le Rollback, comme tu me le fais remarqué.
    Bref, je pense que je vais supprimé mon Rollback qui ne sert à rien et conserver juste mon Raiseerror pour tenter de récupérer un message d'erreur si, et seulement si le tuple n'existe pas.
    Edit : Sans le rollback bien sûr, fin de journée, copier/coller hasardeux toussa...

  4. #4
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par bipbip2006 Voir le message
    Bref, je pense que je vais supprimé mon Rollback qui ne sert à rien et conserver juste mon Raiseerror pour tenter de récupérer un message d'erreur si, et seulement si le tuple n'existe pas.
    Deux possibilités :

    - supprimer le ROLLBACK ou le RAISEERROR
    - peut être aussi utiliser le BEGIN ... END pour délimiter le bloc conditionnel, non ???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    BEGIN
    IF (COLUMNS_UPDATED() & 14 ) > 0 --La c'est si les 3 champs sont modifiés
      BEGIN
        RAISERROR (N'SpupdateAffaire', 10, 1, 15000, 0);
        ROLLBACK TRANSACTION
      END
    END

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 252
    Points : 192
    Points
    192
    Par défaut
    J'ai fais ce que tu as dis (sans le Rollback) mais c'est quand même curieux, même si l'id affaire n'est pas présent, j'ai un return 0 comme si la procédure avait bien mis à jour....
    Edit : Pour préciser, je rentre dans le if si je modifie ou non en fait un AffaireId
    Je ne comprends pas comment on peut modifier un AffaireId qui n'existe pas, là je dois avoir un truc qui m'échappe...

  6. #6
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par bipbip2006 Voir le message
    J'ai fais ce que tu as dis (sans le Rollback) mais c'est quand même curieux, même si l'id affaire n'est pas présent, j'ai un return 0 comme si la procédure avait bien mis à jour....
    Rien de curieux ici : Tu ne gères aucun retour dans ta PS; donc elle retourne 0 par défaut. Ou alors tu n'as pas posté le bon code.

    Je ne comprends pas comment on peut modifier un AffaireId qui n'existe pas, là je dois avoir un truc qui m'échappe...
    Ca ne modifie rien, si la condition WHERE ne correspond à aucune ligne existante; je ne vois pas ce qui te fait dire que ça modifie quelque chose.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 252
    Points : 192
    Points
    192
    Par défaut
    Bey oui mais en fait je suis un peu c.. sur le coup là...
    C'est effectivement tout à fait logique !
    Par contre, pourquoi je n'ai aucun message si je mets à jour les 3 colonnes sur un champs existant ?
    Normalement je rentre (et d'ailleurs j'y rentre, vérifié avec la procédure pas à pas) dans raiserrors....?

  8. #8
    Membre averti
    Homme Profil pro
    R&D
    Inscrit en
    Avril 2004
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : R&D

    Informations forums :
    Inscription : Avril 2004
    Messages : 127
    Points : 406
    Points
    406
    Par défaut
    Citation Envoyé par bipbip2006 Voir le message
    Je souhaite toujours savoir si un tuple existe pour le mettre à jour, sinon je renvoi une valeur de retour à l'utilisateur.
    C'est "standard" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
    UPDATE MaTable SET MonChemp1 = @Value1 WHERE Id  =@Id
    IF @@rowcount = 0
      RETURN -1; -- tuple n'existe pas
    RETURN 0  -- mis à jour OK

Discussions similaires

  1. Réponses: 5
    Dernier message: 01/05/2013, 14h29
  2. Utilisation d'une procédure stockée dans un trigger
    Par CleeM dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 16/06/2008, 17h41
  3. [CR9 Oracle] Executer une procédure stockée depuis un rapport
    Par zodeno dans le forum SAP Crystal Reports
    Réponses: 0
    Dernier message: 26/03/2008, 14h39
  4. executée une procédure stockée depuis access 97
    Par sandmil dans le forum Access
    Réponses: 1
    Dernier message: 12/07/2007, 11h51
  5. Executer une procédure stockée à distance
    Par vvvvv dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 30/11/2006, 16h12

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