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

PostgreSQL Discussion :

[Trigger] Trigger ne se lance pas toujours


Sujet :

PostgreSQL

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2011
    Messages : 20
    Par défaut [Trigger] Trigger ne se lance pas toujours
    Bonjour, j'ai mis en place des Trigger sur mes tables pour connaitre la derniere date ou cette table a été modifié,(insert,update, delete) mais il arrive quelque fois ou le trigger ne s'active pas mais je ne sais pas pourquoi. Il n'y a rien dans le log.

    Voila ma fonction trigger :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TRIGGER trig_an
      AFTER INSERT OR UPDATE OR DELETE
      ON animal
      FOR EACH ROW
      EXECUTE PROCEDURE modif_table_an();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE OR REPLACE FUNCTION modif_table_an()
      RETURNS trigger AS
    $BODY$
    BEGIN
    	UPDATE update_table SET date_update = now()
    	WHERE nom_table_modif LIKE 'animal';
    	RETURN NULL;
    END;
    $BODY$
      LANGUAGE plpgsql VOLATILE
      COST 100;
    ALTER FUNCTION modif_table_an()
      OWNER TO postgres;
    Merci de votre aide.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Il n'y a rien dans le code de la fonction qui expliquerait le problème.
    A quoi se voit le problème d'ailleurs?
    Le date_update n'est pas du tout à la bonne heure?

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2011
    Messages : 20
    Par défaut
    Oui la date_update n'est pas du tout à l'heure.
    exemple: je fais une modification dans ma table (via hibernate), la modification est bien effectuée dans la table mais date_update n'a pas changé.

    Ce problème vient aléatoirement, généralement un coup sur deux.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    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 998
    Billets dans le blog
    6
    Par défaut
    Hibernate est une grosse merde qui génère plus de problème et constitue une boîte opaque dans laquelle il est difficile de savoir ce que cette horreur fait !
    Pour vous donner une idée de pourquoi il faut éviter Hibernate et pas mal d'outils de ce genre, lisez cet article : http://sqlpro.developpez.com/cours/b...s-epaisses.pdf

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

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2011
    Messages : 20
    Par défaut
    Oui je suis d'accord, mais la le trigger est au niveau de postgres et apres l'insert/update, donc peu importe qui fait l'insertion/modif et comment, cela ne devrait pas avoir d'importance non ?

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    Bonjour,

    n'auriez-vous pas des problèmes de lock ?

    Si vous transformez ce trigger en trigger before update / insert et que dedans vous faites un set de la NEW.ma_date, avez-vous encore le même problème ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE TABLE t_tst
    (
      id integer NOT NULL,
      t_date date,
      CONSTRAINT t_tst_pkey PRIMARY KEY (id )
    );
    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
     
    CREATE TRIGGER "_BEF_INS_UPD_DEL"
      BEFORE INSERT OR UPDATE OR DELETE
      ON t_tst
      FOR EACH ROW
      EXECUTE PROCEDURE "_INSERT_BEFORE_DATE"();
     
     
    CREATE OR REPLACE FUNCTION "_INSERT_BEFORE_DATE"()
      RETURNS trigger AS
    $BODY$begin
    NEW.t_date = current_date;
    return new;
    end;$BODY$
      LANGUAGE plpgsql VOLATILE
      COST 100;

  7. #7
    Membre averti
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2011
    Messages : 20
    Par défaut
    Bonjour punkoff,

    je n'ai pas compris ce que vous me demandez de faire. Vous voulez que je mette ce trigger before sur la table dont la date est mise à jour ? ou que je change mon trigger actuel en le mettant en before au lieu d'after ?

    j'ai essayé ca, mais il me dit que new n'existe pas dans la table update_table.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    BEGIN
    	UPDATE update_table SET NEW.date_update = now()
    	WHERE nom_table_modif LIKE 'animal';
    	RETURN new;
    END;
    Merci.

  8. #8
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    Bonjour,

    Oui, de remplacer votre trigger actuel par l'exemple que je vous ai donné pour voir si vos problèmes persiste avec cette méthode.


    Dans votre cas vous updatez une 2eme fois votre ligne juste après le commit (je suppose ?)

    Dans le cas d'un trigger before vous allez remplacer la valeur de votre colonne date juste avant l'update.


    Dans les 2 cas par contre je penses que votre ORM sera désynchronisé avec la base de donnée .... et si vos problèmes viennent de là...

    du coup il faudrait forcer le vidage du ...cache ? (je ne sais plus le therme exacte) afin qu'il récupère les bonnes infos de la base pour l'objet mappé.

  9. #9
    Membre averti
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2011
    Messages : 20
    Par défaut
    En remplaçant par before ce n'est pas possible dans le fonctionnement actuel de l'application, plus rien n'est synchro.

    Par contre par l'opération du saint esprit je n'arrive plus à reproduire le bug du trigger qui ne se lance pas. Alors je ne sais pas comment j'ai corrigé le problème(enfin qu'il n'apparait plus en tout cas), car j'ai modifié pas mal de choses entre temps sans revérifier ce bug.

    Si vous avez une idée d'ou ca pouvait venir je veux bien savoir, des fois que ca revienne.

Discussions similaires

  1. Trigger on insert ne fonctionne pas
    Par Stessy dans le forum PL/SQL
    Réponses: 18
    Dernier message: 18/01/2008, 20h51
  2. Trigger qui ne se déclenche pas
    Par eowyn7 dans le forum Forms
    Réponses: 1
    Dernier message: 13/09/2007, 10h57
  3. trigger qui ne s' execute pas
    Par Fred 57220 dans le forum SQL
    Réponses: 7
    Dernier message: 02/08/2007, 14h21
  4. [trigger] ... qui ne se déclenche pas
    Par bozo dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 14/01/2004, 11h31

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