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 :

Probleme de mise a jour d'une table par rapport a une autre


Sujet :

PostgreSQL

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 36
    Points : 24
    Points
    24
    Par défaut Probleme de mise a jour d'une table par rapport a une autre
    Bonjour je suis nouveau sur le forum et je poste ce message car je rencontre des problemes dans la realisation d'un trigger en pl/pgsql ayant pour but de mettre a jour une table par rapport a une autre quatiment identiques mais avec des champs dont certaines valeurs ont ete modifies a la main.
    Pour tester mon trigger avant de le mettre en prod j'ai cree 2 tables "etudiant" et "student"
    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
     
    CREATE TABLE etudiant(
    logEtud VARCHAR(30) NOT NULL PRIMARY KEY,
    niveauEtud VARCHAR(30) DEFAULT 'normal',
    nameEtud VARCHAR(30),
    surnameEtud VARCHAR(30),
    alterEtud BOOLEAN DEFAULT FALSE,
    idClass INT REFERENCES classe(idClass)
    );
     
    CREATE TABLE student(
    logStud VARCHAR(30) NOT NULL PRIMARY KEY,
    niveauStud VARCHAR(30) DEFAULT 'normal',
    nameStud VARCHAR(30),
    surnameStud VARCHAR(30),
    alterStud BOOLEAN DEFAULT FALSE,
    idClass INT REFERENCES classe(idClass)
    );
    Et j'applique sur la table "etudiant" un trigger ayant pour but de mettre a jour les donnees de la table lors de chaque insertion en verifiant que les valeurs des champs de la table etudiant ayant un attribut "log*" identiques dans la table student soit identiques.

    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
     
    CREATE OR REPLACE FUNCTION process_maj_etudiant() RETURNS TRIGGER AS $$
    	DECLARE
     
    	BEGIN
    		-- En cas d'insertion  mise a jour de la liste des etudiants
    		-- par rapport aux elements communs des tables etudiant 
    		-- et student.
     
    		IF (TG_OP = 'INSERT') THEN 
    			SELECT * FROM etudiant AS update_etudiant
    			WHERE NEW.logEtud = student.logEtud;
    			IF (update_etudiant <> 0) THEN 
    				UPDATE etudiant 
    				SET update_etudiant.niveauEtud = student.niveauStud, 
    				update_etudiant.alterEtud = student.alterStud,
    				WHERE update_etudiant.logEtud = student.logStud;
    			END IF;
    		END IF;
     
    		END;
     
    	$$ LANGUAGE plpgsql;
     
    CREATE TRIGGER maj_etudiant 
    	AFTER INSERT ON etudiant 
    	FOR EACH STATEMENT 
    	EXECUTE PROCEDURE process_maj_etudiant();
    Mais apparemment je dois avoir une erreur quelque part car j'ai un message d'erreur lorsque j'essaie d'effectuer une insertion (le probleme intervient lors de l'insertion sur la table etudiant)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    INSERT INTO student (logStud, nameStud, surnameStud, idClass, alterStud, niveauStud) VALUES('LogF', 'paf', 'test2', 1, TRUE, 'marche ok');
    INSERT INTO student (logStud, nameStud, surnameStud, idClass, alterStud, niveauStud) VALUES('LogG', 'pouf', 'test3', 1, TRUE, 'marche ok');
     
    INSERT INTO etudiant (logEtud, nameEtud, surnameEtud, idClass) VALUES('LogE', 'pif', 'test1', 1);
    INSERT INTO etudiant (logEtud, nameEtud, surnameEtud, idClass) VALUES('LogF', 'paf', 'test2', 1);
    INSERT INTO etudiant (logEtud, nameEtud, surnameEtud, idClass) VALUES('LogG', 'pouf', 'test3', 1);
    le message d'erreur est le suivant : "ERROR: record "new" is not assigned yet"

    Serait-il possible d'obtenir de l'aide car c'est aussi la premiere fois que je connais mieux mysql que pgsql et la realisation de ce trigger me pose enormement de probleme.
    Merci d'avance

  2. #2
    Membre éclairé Avatar de grabriel
    Inscrit en
    Septembre 2006
    Messages
    946
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 946
    Points : 730
    Points
    730
    Par défaut
    Salut,

    je ne sais pas si t'as déjà corrigé ton erreur mais
    WHERE NEW.logEtud = student.logEtud;

    WHERE NEW.logEtud = student.logStud;

    [EDIT]
    En plus je vois pas l'utilité de IF (TG_OP = 'INSERT') sachant que ton trigger est déjà défini sur un insert!!!???

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 36
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par grabriel
    Salut,

    je ne sais pas si t'as déjà corrigé ton erreur mais
    WHERE NEW.logEtud = student.logEtud;

    WHERE NEW.logEtud = student.logStud;

    [EDIT]
    En plus je vois pas l'utilité de IF (TG_OP = 'INSERT') sachant que ton trigger est déjà défini sur un insert!!!???
    J'ai effectue les modifications et j'ai reteste mais le probleme est toujours le meme

  4. #4
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 36
    Points : 24
    Points
    24
    Par défaut
    J'ai un peu refait ma fonction en prenant en compte les remarques precedentes et j'ai un autre message d'erreur toujours en essayant d'effectuer la meme insertion :
    "ERROR: syntax error at or near "$1" at character 22"

    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 OR REPLACE FUNCTION process_maj_etudiant() RETURNS TRIGGER AS $$
     
    	BEGIN 
     
    		UPDATE etudiant SET NEW.niveauEtud = niveauStud,
    		NEW.alterEtud = alterStud FROM student
    		WHERE NEW.logETud = logStud;
    		RETURN NEW;	
    	END;
    	$$ LANGUAGE plpgsql;
     
    CREATE TRIGGER maj_etudiant 
    	AFTER INSERT ON etudiant 
    	FOR EACH ROW 
    	EXECUTE PROCEDURE process_maj_etudiant();
    Pour rappel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    INSERT INTO student (logStud, nameStud, surnameStud, idClass, alterStud, niveauStud) VALUES('LogF', 'paf', 'test2', 1, TRUE, 'marche ok');
    INSERT INTO student (logStud, nameStud, surnameStud, idClass, alterStud, niveauStud) VALUES('LogG', 'pouf', 'test3', 1, TRUE, 'marche ok');
     
    INSERT INTO etudiant (logEtud, nameEtud, surnameEtud, idClass) VALUES('LogE', 'pif', 'test1', 1);
    INSERT INTO etudiant (logEtud, nameEtud, surnameEtud, idClass) VALUES('LogF', 'paf', 'test2', 1);
    INSERT INTO etudiant (logEtud, nameEtud, surnameEtud, idClass) VALUES('LogG', 'pouf', 'test3', 1);
    Merci de votre aide

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 36
    Points : 24
    Points
    24
    Par défaut
    J'ai trouve la solution qui est la suivante si ca interesse quelqu'un d'autres que moi

    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 OR REPLACE FUNCTION process_maj_etudiant() RETURNS TRIGGER AS $$
     
    	BEGIN 
     
    		UPDATE etudiant SET niveauEtud = niveauStud,
    		alterEtud = alterStud FROM student
    		WHERE logETud = logStud;
    		RETURN NEW;	
    	END;
    	$$ LANGUAGE plpgsql;
     
    CREATE TRIGGER maj_etudiant 
    	AFTER INSERT ON etudiant 
    	FOR EACH ROW 
    	EXECUTE PROCEDURE process_maj_etudiant();

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

Discussions similaires

  1. [2.x] mise a jour d'un projet après modification d'une table
    Par DidG_like dans le forum Symfony
    Réponses: 2
    Dernier message: 26/04/2012, 15h07
  2. [Modèle Relationnel] Faire une table par type ou une table des types ?
    Par jax54000 dans le forum Schéma
    Réponses: 12
    Dernier message: 18/11/2009, 11h43
  3. Réponses: 2
    Dernier message: 22/12/2008, 15h29
  4. mise a jour incrémentation existante d'un champ d'une table
    Par alexkickstand dans le forum VBA Access
    Réponses: 4
    Dernier message: 28/08/2008, 15h11
  5. Réponses: 1
    Dernier message: 01/08/2006, 14h43

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