Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/03/2007, 12h11   #1
Invité régulier
 
Inscription : mars 2007
Messages : 36
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 36
Points : 8
Points : 8
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 :
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 :
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 :
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
redpopo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2007, 12h32   #2
Membre chevronné
 
Avatar de grabriel
 
Inscription : septembre 2006
Messages : 935
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 935
Points : 626
Points : 626
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!!!???
grabriel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2007, 12h41   #3
Invité régulier
 
Inscription : mars 2007
Messages : 36
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 36
Points : 8
Points : 8
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
redpopo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2007, 15h26   #4
Invité régulier
 
Inscription : mars 2007
Messages : 36
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 36
Points : 8
Points : 8
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 :
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 :
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
redpopo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2007, 16h14   #5
Invité régulier
 
Inscription : mars 2007
Messages : 36
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 36
Points : 8
Points : 8
J'ai trouve la solution qui est la suivante si ca interesse quelqu'un d'autres que moi

Code :
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();
redpopo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h01.


 
 
 
 
Partenaires

Hébergement Web