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 :

Trigger avec action avant ET apres update de champ ?


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de fredfred
    Inscrit en
    Septembre 2002
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 161
    Par défaut Trigger avec action avant ET apres update de champ ?
    Bonjour,

    Je voudrais savoir s'il est possible de créer un trigger sur un champ d'une table, et que ce trigger puisse agir avant et après l'écriture des données.

    Je m'explique : j'ai une table Article avec QteStock et CMUP.
    Quand QteStock est modifié, je voudrais que le trigger se déclenche et fonctionne de la manière suivante :

    - avant écriture dans la base, on enregistre les valeurs QteStock et CMUP dans une table de travail
    - mise à jour effective de la base
    - après ecriture, on enregistre les nouvelles valeurs dans cette même table de travail.

    Le but final étant d'avoir une table du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      code_art  |   date_heure  |  qte_avant   |  cmup_avant   |  qte_apres   |   cmup_apres
    avec une ligne à chaque fois que QteStock d'un article est modifié.

    Est-ce que c'est jouable ?

    Merci.

  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 : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Les triggers Sql Server (qui sont uniquement des triggers "commande" il n'y a pas de trigger "ligne" en SQL SERVER) exposent deux vues (enfin deux pour les trigger UPDATE) qui sont "delete" et "insert".

    Il suffit de lire la vue "delete" pour obtenir les valeurs "anciennes" et la vue "insert" pour lire les valeurs "nouvelles" (c'est un peu l'équivalent de :old et :new en Oracle, mais qui ne sont dans le cas d'Oracle qu'accessible dans les triggers "ligne").

    Il va de soit qu'un trigger "ON INSERT" n'expose que la vue "insert" et un trigger "ON DELETE" n'expose que la vue "delete".

    Que ensuite tu utilises un trigger BEFORE ou AFTER dépend de tes choix applicatifs. (mais dans ton cas, ce serait plutôt un TRIGGER "AFTER", c'est à dire appelé après la mise à jour).

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 009
    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 : 22 009
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Les triggers Sql Server (qui sont uniquement des triggers "commande" il n'y a pas de trigger "ligne" en SQL SERVER) exposent deux vues (enfin deux pour les trigger UPDATE) qui sont "delete" et "insert".
    NON ! deleted et inserted

    Il suffit de lire la vue "delete" pour obtenir les valeurs "anciennes" et la vue "insert" pour lire les valeurs "nouvelles" (c'est un peu l'équivalent de :old et :new en Oracle, mais qui ne sont dans le cas d'Oracle qu'accessible dans les triggers "ligne").

    Il va de soit qu'un trigger "ON INSERT" n'expose que la vue "insert" et un trigger "ON DELETE" n'expose que la vue "delete".

    Que ensuite tu utilises un trigger BEFORE ou AFTER dépend de tes choix applicatifs. (mais dans ton cas, ce serait plutôt un TRIGGER "AFTER", c'est à dire appelé après la mise à jour).
    NON : il n'y a pas de trigger BEFORE dans SQL Server. Mais des trigger INSTEAD OF et AFTER.

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

  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 : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    NON ! deleted et inserted
    NON : il n'y a pas de trigger BEFORE dans SQL Server. Mais des trigger INSTEAD OF et AFTER.

    A +
    Décidément, 8 mois sans toucher à SQL SERVER ne me réussissent pas....

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 009
    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 : 22 009
    Billets dans le blog
    6
    Par défaut
    et puis il va y avoir DENALI !!!!

    ;-)

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

  6. #6
    Membre très actif Avatar de fredfred
    Inscrit en
    Septembre 2002
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 161
    Par défaut
    J'ai essayé ça

    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
     
    ALTER TRIGGER [dbo].[EV_OCI_ARTSTOCK]
            ON  [dbo].[F_ARTSTOCK]
            FOR UPDATE
     AS
     BEGIN
     
    declare @ref varchar(50)
    DECLARE @old_qte int
    DECLARE @oldMontSto money
     
     -- inutile si pas d'update de la colonne visée
     IF NOT UPDATE(AS_QTESTO)
     RETURN
     
     -- stocke les anciennes valeurs
     SELECT @ref = AR_REF 
     FROM INSERTED
     
     SELECT @old_qte = F_ARTSTOCK.AS_QteSto, @oldMontSto = F_ARTSTOCK.AS_MontSto
     FROM F_ARTSTOCK
     WHERE F_ARTSTOCK.AR_REF = @ref
     
     INSERT INTO OCI_MVTSTOCK (AR_REF, Heure, QTE_AV, CMUP_AV, QTE_AP, CMUP_AP) 
     SELECT INSERTED.AR_REF, getdate(), @old_qte, @oldMontSto, INSERTED.AS_QteSto, INSERTED.AS_MontSto
     FROM INSERTED
     
     -- rollback en cas d'erreur
    IF @@Error <> 0
    ROLLBACK TRANSACTION
     
    END
    Mais les valeurs AV et AP de la table OCI_MVTSTOCK sont identiques, je ne parviens pas à récupérer les valeurs avant l'update.

Discussions similaires

  1. [RegEx] preg_replace un caractère avec espace avant et après
    Par redah75 dans le forum Langage
    Réponses: 24
    Dernier message: 27/09/2011, 21h35
  2. Ouvrir .raw avec header avant et après
    Par Newenda dans le forum MATLAB
    Réponses: 13
    Dernier message: 04/01/2011, 16h56
  3. Trigger avec update sur même table
    Par Thig dans le forum PL/SQL
    Réponses: 7
    Dernier message: 31/08/2007, 15h45
  4. Exec avec paramètres avant et après exécutable
    Par blinkz0rz dans le forum ANT
    Réponses: 3
    Dernier message: 20/07/2006, 15h46
  5. TRIGGER avec inserted + UPDATE sur INSERTED
    Par shaka84 dans le forum Développement
    Réponses: 3
    Dernier message: 12/04/2006, 11h26

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