Überprüfen einer neuen Fläche durch Trigger

Servus,

Ich bin gerade am rumdoktern des folgenden Problems:

Flaeche1 hat eine 1:n Beziehung zu Flaeche2.

flaeche1, fl_id <----- flaeche2, fl_fs
1 : n

Nun möchte ich auch sicher stellen, dass dieser Bezug auch räumlich abgebildet wird, das heißt, ich will nur neu erstellte Geometrien in Flaeche2 zulassen, die innerhalb von Flaeche1 liegen, und dabei die 1:n Beziehung berücksichtigt wird.

Bsp: Flaeche2, fl_fs = 1 muss innerhalb der Flaeche1, fl_id = 1 liegen.

Nun hab ich folgenden Trigger geschrieben und weiß nicht, wieso das nicht funktioniert.

CREATE OR REPLACE FUNCTION check_geom()
  RETURNS "trigger" AS
$BODY$

BEGIN
IF (SELECT st_within(NEW.geometry, a.geometry) FROM flaeche1 a 
WHERE a.fl_id = NEW.fl_fs) <> 1 THEN
	RAISE EXCEPTION 'Erstellte Geometrie liegt nicht in der Flaeche1!';
RETURN NEW;
END IF;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION check_geom() OWNER TO postgres;

CREATE TRIGGER trig_check_geom
  BEFORE INSERT OR UPDATE
  ON flaeche2
  FOR EACH ROW
  EXECUTE PROCEDURE check_geom();

Beim Einfügen jeglicher Geometrie in die Tabelle Flaeche2 - egal ob innerhalb oder ausserhalb der Flaeche1 - erhalte ich die EXCEPTION.

Weiß jemand, wo es hier ein Problem gibt?

gruß,
Johannes

Am besten ist es, wenn mans selbst rausfindet…

Der Code ist bis auf ein paar Winzigkeiten korrekt. So klappts dann auch:

 ...
IF (SELECT st_within(NEW.geometry, a.geometry) FROM flaeche1 a 
WHERE a.fl_id = NEW.fl_fs) = 'f' THEN
RAISE EXCEPTION 'Erstellte Geometrie liegt nicht in der Flaeche1!';
RETURN NULL;
ELSE
RETURN NEW;
...

Der Knackpunkt ist, dass die Subquery zwar True oder False liefert, aber eben nicht als 0 oder 1, sondern als ‘f’ oder ‘t’. :rolleyes:
Und das RETURN NULL und NEW richtig setzen.

Coole Sache.

gruß,
Johannes