Seite 5 von 5

Re: GeODin zu PostGIS, aber wie?

Verfasst: Mi 25. Jan 2017, 16:50
von schweitzerili
Habe mich nun nochmal durch die ganze Trigger-Thematik durchgearbeitet und bin wesentlich weiter gekommen. Folgende Funktion hat sich bisher ergeben:

Code: Alles auswählen

CREATE OR REPLACE FUNCTION public.insert()
  RETURNS trigger AS
$BODY$
      BEGIN
	IF (TG_OP = 'DELETE') THEN
            DELETE FROM postgis.stammdaten WHERE locid = OLD.locid and xcoord = OLD.xcoord and ycoord = OLD.ycoord;
            RETURN OLD;
        ELSIF (TG_OP = 'UPDATE') THEN
            UPDATE postgis.stammdaten 
            SET locid = NEW.locid, xcoord = NEW.xcoord, ycoord = NEW.ycoord
            FROM public.geodin_loc_ssgkrzt1;
            RETURN NEW;
        ELSIF (TG_OP = 'INSERT') THEN
            INSERT INTO postgis.stammdaten SELECT NEW.locid, NEW.xcoord, NEW.ycoord;    		
		RETURN NULL;
      	END IF;
        RETURN NULL;
      END;
  $BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION public.insert()
  OWNER TO postgres;
Der INSERT und DELETE Teil funktioniert einwandfrei. Der UPDATE-Teil funktioniert leider noch nicht wie gewünscht.
Im Moment passiert folgendes: ich ändere den wert einer Zeile in der Spalte locid per update in der urtabelle (public.geodin_loc_ssgkrzt1).
Daraufhin ändert mir der Trigger alle Werte in allen Zeilen und SPalten in der Zieltabelle auf die Werte der betreffenden Zeile aus der Urtabelle. Irgendwie auch logisch bei dem was ich da geschrieben habe.
Ich tu mich sowieso mit der UPDATE-Funktion etwas schwer und wäre über einen ANstoß was ich ändern muss, damit nur der eine entsprechende Wert in der Zieltabele geupdatet wird, sehr dankbar. Wenn ich das habe, habe ich das gesamte Problem gelöst.

Re: GeODin zu PostGIS, aber wie?

Verfasst: Mi 25. Jan 2017, 17:01
von akretschmer
Ja, ich denke mal, ich schenke Dir ein WHERE.

Re: GeODin zu PostGIS, aber wie?

Verfasst: Mi 25. Jan 2017, 17:29
von schweitzerili
So, das WHERE hatte ich schon mal drin, aber an der falschen Stelle und das FROM muss raus... Nun nach 5 Seiten und 42 Beiträgen ist es endlich geschafft xD Falls irgendwann auch mal jemand sowas machen muss hier noch die endgültige Beispielfunktion für einen AFTER Trigger zwischen zwei Schematas für UPDATE, DELETE und INSERT in einem:

Code: Alles auswählen

CREATE OR REPLACE FUNCTION public.insert()
  RETURNS trigger AS
$BODY$
      BEGIN
	IF (TG_OP = 'DELETE') THEN
            DELETE FROM postgis.stammdaten WHERE locid = OLD.locid and xcoord = OLD.xcoord and ycoord = OLD.ycoord;
            RETURN OLD;
        ELSIF (TG_OP = 'UPDATE') THEN
            UPDATE postgis.stammdaten 
            SET locid = NEW.locid, xcoord = NEW.xcoord, ycoord = NEW.ycoord
            WHERE locid = OLD.locid and xcoord = OLD.xcoord and ycoord = OLD.ycoord;
            RETURN NEW;
        ELSIF (TG_OP = 'INSERT') THEN
            INSERT INTO postgis.stammdaten SELECT NEW.locid, NEW.xcoord, NEW.ycoord;    		
		RETURN NULL;
      	END IF;
        RETURN NULL;
      END;
  $BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION public.insert()
  OWNER TO postgres;
  
Danke an euch beide... GISMAN werd ich bestimmt noch wegen der PostGIS-Geometrie nerven, aber das Grundproblem ist gelöst.