Bonjour à tous,
Je suis à la recherche d'un coup de main pour deux triggers.
Le projet que je réalise est une todolist multi utilisateurs.
J'ai un soucis sur le trigger de mise à jour des priorités lorsque je supprime une tâche.
Par exemple :
id | id_utilisateur | title | date_com | date_fin | priorite ----+----------------+---------------------------+------------+----------+---------- 1 | 2 | prevenir salome | 2013-12-03 | | 1 2 | 2 | reviser ds ego | 2013-12-03 | | 2 3 | 2 | faire les course | 2013-12-03 | | 3 4 | 2 | mettre le reveil | 2013-12-03 | | 4 5 | 1 | nourrir le chien | 2013-12-03 | | 1 6 | 1 | tester algo des priorites | 2013-12-03 | | 2 7 | 1 | avancer le projet | 2013-12-03 | | 3 8 | 1 | apprendre rails | 2013-12-03 | | 4
Lorsque je supprime, par exemple la tâche d'ID = 7, je veux que la priorité de la tache 8 (et toute les autres suivantes) diminuent de 1 pour garder une liste de priorités continues.
Or, en fonction de ce que je fais, soit toutes les tâches de ma table sont mise à la même prioritée, soit la tâche est supprimée mais la priorité non modifiée...
Code : Sélectionner tout - Visualiser dans une fenêtre à part DELETE FROM TODO WHERE id = 7;
Je dois effectuer ce traitement via un trigger en PL/pgSQL (c'est un projet dans le cadre de mon DUT Informatique).
C'est la fonction actualise_priorite_suppresion() qui déconne, mais je n'arrive pas trop à voir pourquoi...
Pouvez vous m'aider ?
Merci par avance.
Mon code source :
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71 CREATE TABLE utilisateur ( id SERIAL, login varchar(30) not null, password varchar(30) not null, CONSTRAINT utilisateur_pk PRIMARY KEY(id) ); CREATE TABLE todo ( id SERIAL, id_utilisateur integer not null, title varchar(70) NOT NULL, date_com date not null, date_fin date , priorite numeric(3) , CONSTRAINT todo_pk PRIMARY KEY (id), CONSTRAINT todo_fk FOREIGN KEY (id_utilisateur) REFERENCES utilisateur(id) ); CREATE OR REPLACE FUNCTION genere_priorite() RETURNS TRIGGER AS $$ DECLARE minprio integer; maxprio integer; prio integer; BEGIN select min(priorite) into minprio from todo where id_utilisateur = new.id_utilisateur; select max(priorite) into maxprio from todo where id_utilisateur = new.id_utilisateur; IF minprio is null then prio = 1; ELSE prio = maxprio + 1; END IF; new.priorite := prio; return new; END; $$ LANGUAGE 'plpgsql' ; CREATE TRIGGER generation_priorite BEFORE INSERT ON todo FOR EACH ROW EXECUTE PROCEDURE genere_priorite(); CREATE OR REPLACE FUNCTION actualise_priorite_suppresion() RETURNS TRIGGER AS $$ DECLARE prio_suppr integer; ligne_a_modif RECORD; BEGIN select priorite into prio_suppr from todo where id = old.id and id_utilisateur = old.id_utilisateur; /* BOUCLE NE MARCHE PAS */ FOR ligne_a_modif IN select * from todo where (priorite > prio_suppr and id_utilisateur = old.id_utilisateur) LOOP /*update todo set priorite = old.priorite-1;*/ old.priorite := old.priorite-1; END LOOP; return old; END; $$ LANGUAGE 'plpgsql' ; CREATE TRIGGER actualisation_priorite_suppresion BEFORE DELETE ON todo FOR EACH ROW EXECUTE PROCEDURE actualise_priorite_suppresion();
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 drop trigger generation_priorite on todo; drop trigger actualisation_priorite_suppresion on todo; drop table todo cascade; drop table utilisateur;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 insert into utilisateur(login,password) values ('salome','5678'); insert into utilisateur(login,password) values ('maelig','1234'); insert into todo(id_utilisateur,title,date_com) VALUES(2,'prevenir salome',current_date); insert into todo(id_utilisateur,title,date_com) VALUES(2,'reviser ds ego',current_date); insert into todo(id_utilisateur,title,date_com) VALUES(2,'faire les course',current_date); insert into todo(id_utilisateur,title,date_com) VALUES(2,'mettre le reveil',current_date); insert into todo(id_utilisateur,title,date_com) VALUES(1,'nourrir le chien',current_date); insert into todo(id_utilisateur,title,date_com) VALUES(1,'tester algo des priorites',current_date); insert into todo(id_utilisateur,title,date_com) VALUES(1,'avancer le projet',current_date); insert into todo(id_utilisateur,title,date_com) VALUES(1,'apprendre rails',current_date);
Partager