PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Wyzwalacz aktualizacji PostgreSQL

Jak zauważył @SpartanElite , uruchamiasz nieskończoną pętlę.

Uprość funkcję wyzwalania:

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;
  • Przypisz do NEW bezpośrednio. Nie WHERE w tym przypadku.
  • Trze musisz niedozwolone nazwy kolumn w podwójnym cudzysłowie. Na początek lepiej nie używać takich nazw.
    Ostatnie powiązana odpowiedź.
  • Kod do wstawiania i aktualizacji jest taki sam. Złożyłem się w jedną ścieżkę kodu.

Użyj BEFORE cyngiel. W ten sposób możesz edytować kolumny wiersza wyzwalającego bezpośrednio przed są zapisywane:

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

Jednak

Jeśli po prostu próbujesz utrzymać w tabeli wartość zależną funkcjonalnie (i nie ma innych kwestii):Nie . Zamiast tego użyj widoku lub wygenerowanej kolumny:

Wtedy nie potrzebujesz tego.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak przekonwertować epokę Uniksa na znacznik czasu?

  2. Nie można po prostu użyć nazwy tabeli PostgreSQL (relacja nie istnieje)

  3. Dlaczego polecenie \dt daje - nie znaleziono relacji?

  4. Jak mogę się upewnić, że widok zmaterializowany jest zawsze aktualny?

  5. Optymalizacja zapytań Postgres (wymuszenie skanowania indeksu)