Endlosschleife durch Trigger

Probleme und Fragen zum Thema Trigger und Funktionen.
Antworten
Epitaph
Benutzer
Beiträge: 42
Registriert: Di 14. Apr 2015, 20:53

Endlosschleife durch Trigger

Beitrag von Epitaph » So 13. Sep 2015, 14:38

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.

Code: Alles auswählen

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!

akretschmer
Erfahrener Benutzer
Beiträge: 7458
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: Endlosschleife durch Trigger

Beitrag von akretschmer » So 13. Sep 2015, 15:14

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

castorp
Erfahrener Benutzer
Beiträge: 1038
Registriert: Sa 27. Jun 2009, 22:24

Re: Endlosschleife durch Trigger

Beitrag von castorp » So 13. Sep 2015, 18:03

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

Code: Alles auswählen

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.
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

Epitaph
Benutzer
Beiträge: 42
Registriert: Di 14. Apr 2015, 20:53

Re: Endlosschleife durch Trigger

Beitrag von Epitaph » So 13. Sep 2015, 19:18

@ 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.

Antworten