2017-03-10 2 views
1

J'ai écrit cette fonction et ce déclencheur:Trigger de mettre à jour une colonne sur la mise à jour

CREATE OR REPLACE FUNCTION test4() RETURNS TRIGGER AS $BODY$ 
BEGIN 
    UPDATE "cf" 
    SET vol=(area*alt); 
RETURN null; 
END; 
$BODY$ 
LANGUAGE plpgsql 

déclencheur

CREATE TRIGGER trig_upd 
AFTER OR UPDATE ON "cf" 
FOR EACH ROW 
EXECUTE PROCEDURE test4(); 

J'ai testé ma fonction et il est ok. J'ai donc créé le trigger, mais je ne peux pas insérer de valeur dans la table "cf" car le système plante.

+0

s'il vous plaît donner quelques détails sur il se bloque –

+0

'OU APRÈS update'? Peut-être que vous voulez 'AFTER INSERT OR UPDATE' à la place. - Vous devriez utiliser l'enregistrement ['NEW'] (https://www.postgresql.org/docs/current/static/plpgsql-trigger.html), au lieu de' UPDATE' sur toute la table. (sous sa forme actuelle, votre déclencheur appelle une boucle infinie et à cause de 'RETURN null' il révoquerait un insert réel quand la table est vide - et il n'y a pas de boucle infinie) – pozs

+0

Pourquoi mettez-vous à jour toutes les lignes ** cette table chaque fois qu'une seule ligne est mise à jour? –

Répondre

2

Si vous souhaitez mettre à jour la valeur de vol pour chaque ligne modifiée, n'utilisez pas la mise à jour, attribuez simplement la valeur. Pour que cela fonctionne, il faut également définir le déclencheur comme avant déclencheur:

CREATE OR REPLACE FUNCTION test4() RETURNS TRIGGER 
AS 
$BODY$ 
BEGIN 
    new.vol := new.area * new.alt; 
    RETURN new; 
END; 
$BODY$ 
LANGUAGE plpgsql; 

CREATE TRIGGER trig_upd 
BEFORE UPDATE ON "cf" --<< note the BEFORE! 
FOR EACH ROW 
EXECUTE PROCEDURE test4() 
+0

Merci pour l'aide mais ça ne marche pas. Je pense que le problème est new.vol: = shape_area * alt; parce que le programme me montre un message "colonne n'existe pas.Toute solution? – Giocor

+0

@Giocor: voir mon edit –

+0

Parfait! Merci !! – Giocor