PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL-Update-Trigger

Wie @SpartanElite betonte , lösen Sie eine Endlosschleife aus.

Vereinfachen Sie die Triggerfunktion:

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;
  • Zuordnen zu NEW direkt. Kein WHERE in diesem Fall.
  • Sie müssen unzulässige Spaltennamen in doppelte Anführungszeichen setzen. Verwenden Sie solche Namen besser erst gar nicht.
    Neueste entsprechende Antwort.
  • Code für Insert &Upgrade ist derselbe. Ich habe in einen Codepfad gefaltet.

Verwenden Sie ein BEFORE Abzug. Auf diese Weise können Sie Spalten der auslösenden Zeile direkt vorher bearbeiten sie werden gespeichert:

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

Allerdings

Wenn Sie versuchen nur, einen funktional abhängigen Wert in der Tabelle beizubehalten (und es gibt keine weiteren Überlegungen):Nicht . Verwenden Sie stattdessen eine Ansicht oder eine generierte Spalte:

Dann brauchen Sie nichts davon.