UPDATE-Trigger und manuelles UPDATE - verschiedene Ergebnisse

Ich befülle 4 von 5 Spalten in einer Tabelle mit INSERT. DIe 5. Spalte befülle ich danach mit folgender UPDATE-Bedingung.

update "Ausgabe".stammdaten
	SET srid = 31468 where xcoord >4000000;
update "Ausgabe".stammdaten	
	SET srid = 31467 where xcoord >3000000 and xcoord <4000000;

funktioniert einfach und schnell.

Nun möchte ich diese UPDATES aber nicht jedes mal händisch ausführen wenn was in die Tabelle geschrieben oder geupdatet wird.
Also setze ich einen Trigger der diese 5 Spalte automatisch ausfüllt.

Jedoch wenn ich diese UPDATES in einen Trigger als Funktion setze und befülle die ersten 4 spalten per insert, kommt kein Fehler sondern die Abfrage dauert und dauert und dauert (4000 Zeilen ca.). Nach maximal 1min brech ich das ganze dann immer ab. Die Funktion sieht ja eigentlich ganz einfach aus.

CREATE OR REPLACE FUNCTION "Ausgabe".srid_update()
  RETURNS trigger AS
$BODY$
      BEGIN
        UPDATE "Ausgabe".stammdaten
	SET srid = 31468 where xcoord >4000000;
	RETURN NULL;
	UPDATE "Ausgabe".stammdaten	
	SET srid = 31467 where xcoord >3000000 and xcoord <4000000;
        RETURN NULL;
      END;
  $BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
  
  
 CREATE TRIGGER srid_update 
AFTER 
INSERT OR UPDATE 
ON "Ausgabe".stammdaten 
FOR EACH ROW
EXECUTE PROCEDURE "Ausgabe".srid_update();

Wo liegt der Fehler in dem Trigger? Oder ist der Grundgedanke falsch?

Vielen Dank

Hallo schweitzerli

das update im Trigger löst erneut den Trigger aus. Damit hast du eine Endlosschleife.
Der Trigger wird für jeden Datensatz aufgerufen. Nutze die speziellen Triggervariablen
https://www.postgresql.org/docs/current/static/plpgsql-trigger.html

Grüße
Uli

Hallo,

ja das habe ich auch schon mit einem new. vor dem xcoord probiert. dann passiert aber entweder das selbe wie vorher oder die Zeile wird eingefügt ohne das in die SRID-Spalte geupdatet wird. Je nachdem was für eine Zahl ich bei xcoord inserte…

Oder muss ich etwas anderes verwenden?

einfach in der trigger-funktion mit case when … hantieren und new.SPALTE passend setzen, als BEFORE-Trigger. Du schaffst das…

als before trigger? echt? wieso das?

ok danke. ich versuch mal mein glück

so, nach zwischenzeitlich völliger verzweiflung, ist diese simple geschichte nun auch gelöst. DAnke

Falls jemand von euch zeit hat und es halbwegs simpel erklären kann: wieso ein before trigger? ein update muss doch auch AFTER funktionieren oder?
Klar ist das komplizierter aber rein theoretisch muss das doch möglich sein!? wenn ich es manuell mache, update ich doch auch erst NACH dem INSERT!?
Diese Trigger sind fies für mein beschränktes logisches denken… xD

der einzufügende Datensatz wird VOR dem einfügen noch manipulert.

Ein before Trigger wird aufgerufen bevor die Daten auf die Platte geschrieben werden.
Ein after Trigger wird aufgerufen nachdem die Daten auf die Platte geschrieben wurden.

Die Zuweisung von Spaltenwerten mittels z.B. “new.col_1 := 42” wird im Speicher gemacht.
Diese Änderung wirkt sich natürlich nicht auf die Daten auf der Platte aus, wenn diese bereits auf die Platte geschrieben wurden.

Deswegen kann man so eine Änderung nur machen bevor der Datensatz geschrieben wird.

ok, danke. beide antworten zusammen erklären es super ^^ das heißt die record-variablen werden quasi im RAM besetzt und je nach trigger-typ werden diese abgerufen, davor oder danach. Richtig?