Endlosschleife durch Trigger

Hallo,

ich habe beispielhaft eine Tabelle mit Benutzerdaten und möchte die Spalte ‘adresse’, welche sich aus den Spalten ‘strasse’ und ‘hausnummer’ zusammensetzt, für jeden neuen Eintrag bzw. für geänderte Einträge mittels Trigger aktualisieren. Wie verhindere ich die im nachfolgendem Code auftretende Endlosschleife? Der Trigger ruft sich durch das Setzen der Spalte ‘adresse’ offenbar immer wieder selbst auf.

CREATE TABLE public.benutzer (
	id serial NOT NULL,
	strasse varchar,
	hausnummer varchar,
	adresse varchar,
	CONSTRAINT benutzer_pkey PRIMARY KEY (id)
);
	
CREATE TRIGGER trigger_adresse BEFORE INSERT OR UPDATE
ON public.benutzer FOR EACH ROW
EXECUTE PROCEDURE adresse();

CREATE OR REPLACE FUNCTION adresse()
RETURNS trigger AS $body$
	BEGIN
	EXECUTE 'UPDATE public.benutzer SET adresse = strasse || hausnummer'
	USING NEW;
	RETURN NEW;
	END;
$body$ LANGUAGE plpgsql;

Vielen Dank!

In der Funktion das Execute mit dem Update raus und dafür NEW. setzen. Aber insgesamt ist das so auch Bullshit, die Konkatenation kannst Du beim Select machen. Und setz da noch ein Leerzeichen dazwischen …

Du brauchst kein update, es Reicht den Wert der NEW Variablen zuzuweisen:

CREATE TRIGGER trigger_adresse BEFORE INSERT OR UPDATE
ON public.benutzer FOR EACH ROW
EXECUTE PROCEDURE adresse();

CREATE OR REPLACE FUNCTION adresse()
RETURNS trigger AS $body$
BEGIN
  new.adresse := concat(new.strasse, new.hausnummer);
  RETURN NEW;
END;
$body$ LANGUAGE plpgsql;

concat() hat den Vorteil, dass es NULL-Werte als leeren String betrachtet. Bei || ist das Ergebnis NULL wenn einer der Werte NULL ist.

@ akretschmer

Es handelt sich nur um ein Beispiel. Ich benötige für eine PostGIS Geometrie, welche an eine andere Stelle übermittelt wird, eine Spalte mit zusammengesetzen Werten.

@ castorp

Vielen Dank, funktioniert wunderbar! Ich nutze nun concat_ws, um auch Trennzeichen verwenden zu können.