PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Déclencheur de mise à jour PostgreSQL

Comme @SpartanElite l'a souligné , vous déclenchez une boucle sans fin.

Simplifiez la fonction de déclenchement :

CREATE OR REPLACE FUNCTION set_angle()
  RETURNS TRIGGER AS
$func$
BEGIN
   NEW."rotationAngle" := degrees(
                             ST_Azimuth(
                                ST_StartPoint(NEW.the_geom)
                              , ST_EndPoint(NEW.the_geom)
                             )
                          ) - 90;
   RETURN NEW;
END
$func$ LANGUAGE plpgsql;
  • Attribuer à NEW directement. Non WHERE dans ce cas.
  • Vous devez noms de colonnes non autorisés entre guillemets doubles. Mieux vaut ne pas utiliser de tels noms pour commencer. réponse connexe.
  • Le code pour l'insertion et la mise à niveau est le même. J'ai plié en un seul chemin de code.

Utilisez un BEFORE gâchette. De cette façon, vous pouvez modifier les colonnes de la ligne de déclenchement directement avant ils sont enregistrés :

CREATE TRIGGER set_angle
BEFORE INSERT OR UPDATE ON annotations
FOR EACH ROW EXECUTE PROCEDURE set_angle();

Cependant

Si vous essayez simplement de conserver une valeur fonctionnellement dépendante dans la table (et il n'y a pas d'autres considérations) :Ne pas . Utilisez plutôt une vue ou une colonne générée :

Alors vous n'avez pas besoin de tout cela.