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.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
DELETE FROM TODO WHERE id = 7;
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...

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);