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 :

Création et utilisation des trigger


Sujet :

PostgreSQL

  1. #1
    Membre habitué
    Profil pro
    Expert technique
    Inscrit en
    Septembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 328
    Points : 159
    Points
    159
    Par défaut Création et utilisation des trigger
    Bonjour,

    J'apprends à utiliser postgresql. Après de multiples essai je galère pour créer et utiliser des triggers. J'ai suivi des tonnes de tutos sur le net, mais je n'y arrive pas car je ne comprends pas la logique.
    Voilà un exemple hyper simple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    table1
    ======
    id
    nom
    table2_id
     
    table2
    ======
    id
    nom
    Voilà je voudrai que lorsque j'insère dans table1, une nouvelle insertion se fasse dans table2 et l'id de cette insertion soit également insérée dans la table1 et l'id inséré dans la table1 soir retourné.
    Très simple comme example non ? Et ben je n'y arrive pas !

    Voilà ce que j'ai fat et qui ne marche pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE FUNCTION testfunction() RETURNS trigger
    	LANGUAGE plpgsql
    	AS $$
    	BEGIN
    		insert into table2(nom) VALUES (NEW.nom) RETURNING id AS idtemp;
                    insert into table1(nom,table2_id) VALUES (idtemp) RETURNING id;
    		RETURN id;
    	END;
    $$;
     
    CREATE TRIGGER testtrigger BEFORE INSERT ON table1 FOR EACH ROW EXECUTE PROCEDURE testfunction();
     
    INSERT INTO table1 (nom) VALUES ('Jeff') RETURNING id;
    Pourriez-vous me donner un exemple fonctionnel que je comprenne svp ?

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 129
    Points : 38 521
    Points
    38 521
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par zerros Voir le message
    Voilà je voudrai que lorsque j'insère dans table1, une nouvelle insertion se fasse dans table2 et l'id de cette insertion soit également insérée dans la table1 et l'id inséré dans la table1 soir retourné.
    vous n'êtes pas confronté à un problème de trigger, mais de logique :

    D'après votre modèle de données, la colonne Table1.table2_id est une foreign key dans table1, qui fait référence à Table2.id PK de Table2

    Donc la séquence des opérations doit être
    -1- insertion dans Table2
    -2- insertion dans Table1 avec Table1.table2_id = Table2.id précédemment inséré
    -3- commit

    Votre logique consiste en une boucle infinie et ne peut être mise en œuvre, quelque soit le moyen et le SGBD !

  3. #3
    Membre habitué
    Profil pro
    Expert technique
    Inscrit en
    Septembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 328
    Points : 159
    Points
    159
    Par défaut
    Non, en fait je n'ai pas fait de foreign key entre les deux. Il n'y a pas de relation. Je veux juste stocker l'id de la table2 dans la table1.
    J'ai fini par réussir à faire ce que je veux en le faisant à l'envers, cad:

    - insertion dans table1 sans l'id table2
    - insertion dans table2 avec récupérationd de l'id créé
    - update de la table1

    Et je suis même allé plus loin en découvrant le fonctionnement json dans les trigger. Bon je teste, mais c'est super intéressant

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 129
    Points : 38 521
    Points
    38 521
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par zerros Voir le message
    Non, en fait je n'ai pas fait de foreign key entre les deux. Il n'y a pas de relation. Je veux juste stocker l'id de la table2 dans la table1.
    Et bien c'est un tort : l'une des premières qualités d'une base de données est de garantir l'intégrité des données, et le seul moyen pour cela est de mettre en œuvre les contraintes notamment celles de type référence qui concernent les FK
    Garantir ça signifie 100%, or aucun contrôle applicatif n'est en mesure de garantir l'intégrité seul le SGBD sait le faire.

  5. #5
    Membre habitué
    Profil pro
    Expert technique
    Inscrit en
    Septembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 328
    Points : 159
    Points
    159
    Par défaut
    euh oui. mais là je ne fais qu'apprendre à utiliser des triggers. J'ai juste créé 2 tables bidons que j'essaie d'alimenter via un trigger. C'est juste un test.
    Je suis tout à fait d'accord par rapport à l'intégrité des données sur une base de données finale pour une application/site final

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

Discussions similaires

  1. Création et utilisation des Plugins pour les applications
    Par tayeb.meftah dans le forum Langage
    Réponses: 3
    Dernier message: 20/02/2009, 18h03
  2. Utilisation des triggers
    Par nounetmasque dans le forum SQL Procédural
    Réponses: 13
    Dernier message: 24/08/2007, 10h06
  3. Réponses: 1
    Dernier message: 18/01/2007, 11h45
  4. utilisation des triggers
    Par bouleboule dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 04/07/2005, 17h47
  5. Delphi5 (IBX) - Interbase6.0 + Utilisation des triggers
    Par _Marsu_ dans le forum Bases de données
    Réponses: 3
    Dernier message: 04/04/2004, 18h02

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