PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 29/11/2011 12:26:29

Geo-x
Membre

Trigger lors de la mise à jour d'une colonne en particulier

Bonjour à tous,

ravi de vous retrouver aujourd'hui pour un nouveau problème.
J'essaie de mettre en place un trigger, qui permet de modifier une colonne B (en y intégrant le texte 'Modifié'), si une colonne A est modifiée.

Voici le code actuel :

CREATE OR REPLACE FUNCTION update_modifs() 
RETURNS "trigger" AS $BODY$

    BEGIN
	
		NEW.colonneB:='Modifié';
		RETURN NEW;
    END;

$BODY$

LANGUAGE 'plpgsql'IMMUTABLE;
ALTER FUNCTION update_modifs() OWNER TO postgres;

CREATE TRIGGER update_modifs 
BEFORE INSERT OR UPDATE OF colonneA ON table 
FOR EACH ROW 
EXECUTE PROCEDURE update_modifs();

Et avec toutes la doc, je ne vois pas du tout d'où peut venir le problème, il me met le message suivant :

ERROR:  syntax error at or near "OF"
LIGNE 16 : AFTER INSERT OR UPDATE OF colonneA ON table

Le OF le dérange visiblement. Avez-vous une explication?

Hors ligne

#2 29/11/2011 12:51:01

Marc Cousin
Membre

Re : Trigger lors de la mise à jour d'une colonne en particulier

Non, aucun problème de syntaxe. Enfin, en 9.0 et 9.1. En 8.4, j'ai exactement la même erreur que vous… puisque les triggers sur colonnes ne sont supportés qu'en 9.0 et supérieurs.


Marc.

Hors ligne

#3 29/11/2011 12:52:18

Geo-x
Membre

Re : Trigger lors de la mise à jour d'une colonne en particulier

C'est donc ça!

De quoi s'arracher les cheveux. Il n'existe aucun moyen de contourner ce problème avec la 8.4 ?

Hors ligne

#4 29/11/2011 13:15:47

Marc Cousin
Membre

Re : Trigger lors de la mise à jour d'une colonne en particulier

En 8.4, il faut faire un trigger sur la table, et détecter ce qui a changé sur l'enregistrement: quelque chose comme IF new.cola <> old.cola mais en faisant attention aux valeurs NULL: «new.cola <> old.cola» vaudra NULL si une des deux valeurs est NULL, ce qui empêcherait le déclenchement de ce qui est dans le IF.

C'est évidemment plus simple si on a une contrainte NOT NULL.

Dernière modification par Marc Cousin (29/11/2011 13:16:09)


Marc.

Hors ligne

#5 29/11/2011 14:37:33

Geo-x
Membre

Re : Trigger lors de la mise à jour d'une colonne en particulier

D'accord, merci Marc, donc j'ai testé et voici une solution codée :

CREATE OR REPLACE FUNCTION update_modifs() 
RETURNS "trigger" AS 

$BODY$
    BEGIN
	IF 
		old.colonneA IS NULL OR new.colonneA IS NULL
		THEN
		NEW.coloneB='';
		RETURN NEW;
	ELSIF 
		new.colonneA<>old.colonneA
		THEN
		NEW.coloneB:='Modifié';
		RETURN NEW;
	END IF;
    END;
$BODY$

LANGUAGE 'plpgsql'IMMUTABLE;
ALTER FUNCTION update_modifs() OWNER TO postgres;

CREATE TRIGGER update_modifs 
BEFORE INSERT OR UPDATE ON table 
FOR EACH ROW 
EXECUTE PROCEDURE update_modifs();

A bientôt!

Hors ligne

#6 30/11/2011 13:27:44

dverite
Membre

Re : Trigger lors de la mise à jour d'une colonne en particulier

Il me semble que ce trigger ne retourne pas NEW quand colonneA n'a pas changé et n'est pas NULL, dans ce cas il ne retourne rien.
C'est une erreur, il faut obligatoirement retourner NEW.

Accessoirement, pour ce genre de test le plus simple est d'utiliser IF new.colonneA  IS DISTINCT FROM  old.colonneA THEN... END IF, qui fonctionne comme attendu y compris quand il y a des valeurs nulles.

Hors ligne

Pied de page des forums