Bonjour à tous,

J'ai un léger soucis avec une fonction et un trigger en PL pgSQL.

Je dispose d'une table 'énumération' (je ne donne pas les détails de l'implémentation, mais il s'agit d'une table et non d'un type énum). Lors de la suppression d'une occurrence dans cette table, je veux vérifier qu'elle n'est pas utilisée par une occurrence de la table 'log'.

Mon code est donc le suivant:

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
 
DROP TRIGGER log_enumeration_value_on_delete ON log_enumeration_value CASCADE;
 
CREATE OR REPLACE FUNCTION log_enumeration_value_on_delete()
	RETURNS TRIGGER LANGUAGE plpgsql AS $$
	DECLARE
		row RECORD;
	BEGIN
		FOR row IN (SELECT * FROM log WHERE id_log_name = OLD."id_log_name" AND value_integer = OLD."id_log_enumeration_value") LOOP
			IF row IS NOT NULL THEN
				RAISE EXCEPTION 'The log enumeration value is used by at least one log';
			END IF;
		END LOOP;
		RETURN OLD;
	END
$$;
 
CREATE TRIGGER "log_enumeration_value_on_delete"
	BEFORE DELETE ON log_enumeration_value
	FOR EACH ROW EXECUTE PROCEDURE log_enumeration_value_on_delete()
;
Cependant, dans tout les cas la suppression se fait sans soucis, même lorsque je devrais récupérer une exception

Avez vous une idée ?

EDIT:

Après un peu de debug, je me rends compte que je ne rentre jamais dans ma boucle FOR !
J'ai donc surement une erreur sur la ligne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
FOR row IN (SELECT * FROM log WHERE id_log_name = OLD."id_log_name" AND value_integer = OLD."id_log_enumeration_value") LOOP
mais j'ai un peu de mal à comprendre où :/