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

Langage SQL Discussion :

Trigger suppression et insertion


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 192
    Points : 47
    Points
    47
    Par défaut Trigger suppression et insertion
    Salut à tous

    Je veux créer un trigger qui supprime les champs d'une ligne voulu
    (on va dire quand num_materiel = "&num_materiel&"
    && date = "&date&"
    && km = "&km&"
    && evenement = "&evenement&" ))

    et qui avant de les supprimer les insert dans une table "historique_event"

    j'ai deja crée la table historique_event avec les memes champs que ma table qui sera supprimé ligne apres ligne ...

    Maintenant, j'ai fait un petit truc,

    Quelqu'un peut jeter un coup d'oeil ?
    Merci d'avance
    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
    CREATE OR REPLACE TRIGGER Histo_event
    BEFORE 
    DELETE ON parc_gestion_vehicule 
    BEGIN 
    INSERT INTO parc_historique_event
         ( num_materiel,
           date,
           km,
           evenement,
           prestataire,
    	   montant,
    	   nb_heure,
    	   commentaire, 
           createur )
        VALUES
           ( num_materiel,
           date,
           km,
           evenement,
           prestataire,
    	   montant,
    	   nb_heure,
    	   commentaire, 
           createur ).

  2. #2
    say
    say est déconnecté
    Membre expérimenté
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 300
    Points
    1 300
    Par défaut
    VALUES
    ( OLD.num_materiel,
    OLD.date,
    OLD. km,
    OLD.evenement,
    OLD.prestataire,
    OLD.montant,
    OLD.nb_heure,
    OLD.commentaire,
    OLD.createur )
    il me semble...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 192
    Points : 47
    Points
    47
    Par défaut
    arff
    erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Msg*156, Niveau*15, État*1, Ligne*1
    Syntaxe incorrecte vers le mot clé 'OR'.
    Msg*128, Niveau*15, État*1, Ligne*16
    Le nom "OLD.num_materiel" n'est pas autorisé dans ce contexte. Les expressions valides sont des constantes, des expressions constantes et (dans certains contextes) des variables. Les noms de colonnes ne sont pas autorisés.
    .

    De plus dans mon trigger, je n'exprime pas encore la condition que je supprime la ligne ou le num_materiel = &num_materiel& et dat =&dat& et km = ...

    Vous me suivez toujours ?

  4. #4
    say
    say est déconnecté
    Membre expérimenté
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 300
    Points
    1 300
    Par défaut
    mouais, je m'y attendais un peu.

    En fait, je suis sous postgreSQL, ce n'est peut-être pas standard.
    J'ai typiquement le même style de trigger pour archivage avant suppression :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE OR REPLACE FUNCTION log.ft_logstudent()
      RETURNS trigger AS
    $BODY$DECLARE
     
    BEGIN
    	INSERT INTO t_logstudent (lu_id, ls_name, ls_firstname, ls_deluser,ls_deldate) VALUES (OLD.u_id, OLD.s_name, OLD.s_firstname, session_user, current_timestamp);
    	RETURN OLD;
    END;$BODY$
      LANGUAGE 'plpgsql' VOLATILE
      COST 100;
    ALTER FUNCTION log.ft_logstudent() OWNER TO charly;
    alors j'ai pas mieux.

    Désolé

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 192
    Points : 47
    Points
    47
    Par défaut
    Ton trigger marche chez toi ?

    Tu l'a fait ou la suppression ?
    A quoi corresponde tes variables et ce qui suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $BODY$DECLARE
     
    $BODY$
      LANGUAGE 'plpgsql' VOLATILE
      COST 100;
    ALTER FUNCTION log.ft_logstudent() OWNER TO charly;

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 240
    Points : 12 872
    Points
    12 872
    Par défaut
    Bonjour,
    Tu n'as pas précisé quel SGBd tu utilises. Avec MaxDb il faut utiliser :old.LeChamp dans les requêtes (mais pas dans le reste du code !).
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE TRIGGER T_UPDATE FOR TORPEDO.ARTICLE AFTER UPDATE EXECUTE(
    IF NEW.ETP_C_CODE = 'AIMP' THEN
        CALL TORPEDO.GESTIONMESSAGEATTENTE('FA',:NEW.ART_C_REF,NULL);
    UPDATE TORPEDO.ARTICLE SET ART_D_MODIF = NOW() WHERE ARTICLE.ART_C_REF = :NEW.ART_C_REF IGNORE TRIGGER;
    IF NEW.ETP_C_REASSORT = 'AIMP' THEN
    CALL TORPEDO.GESTIONMESSAGEATTENTE('MR',:NEW.ART_C_REF,NULL);
    )
    Tatayo

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 192
    Points : 47
    Points
    47
    Par défaut
    J'utilise SQL serveur ....Mangement Studio Express ...
    C'est la 2003 de tête...

  8. #8
    say
    say est déconnecté
    Membre expérimenté
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 300
    Points
    1 300
    Par défaut
    oui, oui il fonctionne depuis plus de 2 ans.

    de quelles variables parle tu??

    et ce que tu as cité, correspond à la syntaxe de déclaration de la fonction trigger... mais c'est pour postgresql

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TRIGGER trig_logstudent
      BEFORE DELETE
      ON cocktail.t_student
      FOR EACH ROW
      EXECUTE PROCEDURE log.ft_logstudent();

  9. #9
    say
    say est déconnecté
    Membre expérimenté
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Points : 1 300
    Points
    1 300
    Par défaut
    le mieux, serait peut-etre de poser la question dans le forum SQL Server alors...

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    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 : 21 849
    Points : 52 975
    Points
    52 975
    Billets dans le blog
    6
    Par défaut
    Pour SQL Server :

    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
    CREATE TRIGGER Histo_event
    ON parc_gestion_vehicule 
    FOR DELETE
    AS
    BEGIN 
    INSERT INTO parc_historique_event
         ( num_materiel,
           date,
           km,
           evenement,
           prestataire,
    	   montant,
    	   nb_heure,
    	   commentaire, 
           createur )
        SELECT num_materiel,
           date,
           km,
           evenement,
           prestataire,
    	   montant,
    	   nb_heure,
    	   commentaire, 
           createur
        FROM inserted;
    END;
    Tout simplement.

    A +

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 192
    Points : 47
    Points
    47
    Par défaut
    Ca me parait bien mais je pensais mettre dans mon trigger ma requête de suppression et d'insertion ...
    OR RIEN ??
    Ne devrais -je pas mettre :
    When num_materiel = ... and date = .. and ...
    Enfin ma clef primaire ? ^^
    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
    CREATE TRIGGER Histo_event
    ON parc_gestion_vehicule 
    FOR DELETE
    AS
    BEGIN 
    INSERT INTO parc_historique_event
         ( num_materiel,
           date,
           km,
           evenement,
           prestataire,
    	   montant,
    	   nb_heure,
    	   commentaire, 
           createur )
        SELECT num_materiel,
           date,
           km,
           evenement,
           prestataire,
    	   montant,
    	   nb_heure,
    	   commentaire, 
           createur
        FROM inserted;
    END;

  12. #12
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    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 : 21 849
    Points : 52 975
    Points
    52 975
    Billets dans le blog
    6
    Par défaut
    Pourquoi voulez-vous compliquer quelque chose qui est simple, répond à votre besoin et fonctionne parfaitement ?
    Êtes vous maso ???

    A +

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 192
    Points : 47
    Points
    47
    Par défaut
    Le problème est bien la

    Il ne fonctionne pas.
    D'accord il n'y a pas de message d'erreur quand je l'exécute.
    Mais quand je supprime manuellement une ligne de ma table parc_gestion_vehicule, je ne la retrouve pas dans ma table d'historique..

    Donc problème au niveau du insert ...

  14. #14
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    A vue de nez je dirai qu'il faut remplacer le "FROM inserted" par "FROM deleted".

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 192
    Points : 47
    Points
    47
    Par défaut
    Et ba c'est vraiment nickel
    Merci beaucoup

    (reste plus qu'a ce qu'il marche avec mon programme ...)

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

Discussions similaires

  1. Trigger suite à un insert.
    Par SQLnotForever dans le forum Administration
    Réponses: 7
    Dernier message: 19/03/2007, 16h41
  2. [SQL2005]Trigger On delete, insert, update(colonne)
    Par slim dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 27/02/2007, 16h36
  3. Simple Trigger before on insert.
    Par gregb34 dans le forum Oracle
    Réponses: 7
    Dernier message: 28/05/2006, 07h27
  4. Réponses: 2
    Dernier message: 01/03/2006, 15h16
  5. trigger suite a insert
    Par DaxTaz dans le forum Développement
    Réponses: 4
    Dernier message: 07/07/2004, 11h27

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