sql >> Base de Datos >  >> RDS >> PostgreSQL

Disparador de actualización de PostgreSQL

Como señaló @SpartanElite , está desencadenando un bucle sin fin.

Simplifique la función de disparo:

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;
  • Asignar a NEW directamente. Sin WHERE en este caso.
  • Usted debe nombres de columnas ilegales entre comillas dobles. Para empezar, es mejor no usar esos nombres.
    Recent respuesta relacionada.
  • El código para insertar y actualizar es el mismo. Doblé en una ruta de código.

Usa un BEFORE generar. De esta forma, puede editar las columnas de la fila de activación directamente antes se guardan:

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

Sin embargo

Si solo está tratando de conservar un valor funcionalmente dependiente en la tabla (y no hay otras consideraciones):No . Use una vista o una columna generada en su lugar:

Entonces no necesitas nada de esto.