Fehlermeldung bei DELETE FROM...

Hallo!

da ich erst vor kurzem wirklich begonnen habe auch eigene sql Scripts zu schreiben, bin ich momentan etwas hilflos. Ich hoffe also zumindest einen kleinen Hinweis zu bekommen und somit etwas schneller voran…

… zunächst: Ich habe eine Tabelle mit Polygonen aus der ich alle Punkte der Polygone in eine neue tabelle einlesen will. Wenn also neue Polygone kartiert werden, soll der trigger die Punkte automatisch auslesen und speichern, sowie die Punkte der gelöschten Polygone entfernen. Mittlerweile funktioniert das auslesen der Punkte, sowie der id der Polygone. Allerdings habe ich probleme die gelöschten Punkte zu entfernen.
Zum besseren Verständnis erst mal was ich bisher habe:

BEGIN

INSERT INTO trafo.points_img (gid, parcelid, geom)
(SELECT nextval(‘trafo.seq_gid_points_img’) as gid, a.parcelid, a.geom FROM (SELECT b.gid as parcelid,(my_ST_DumpPoints(geom)).* as geom FROM schemaC.parcel as b)as a);

DELETE FROM trafo.points_img AS t WHERE NOT EXISTS (SELECT ‘exists’ FROM schemaC.parcel.gid AS c WHERE c.gid = t.gid);

RETURN NEW;

Und hier der Trigger in meiner polygon tabelle:

CREATE TRIGGER polygonpoints
BEFORE INSERT OR UPDATE
ON schemaC.parcel
FOR EACH ROW
EXECUTE PROCEDURE trafo.polygonpoints();


Und hier der Fehler der auftritt, wenn ich ein neues polygon hinzufüge:


pgAdmin III

An error has occurred:

FEHLER: Verweise auf andere Datenbanken sind nicht implementiert: »schemaC.parcel.gid«
LINE 1: …trafo.points_img.gid NOT IN (SELECT ‘exists’ FROM schemaC.p…
^
QUERY: DELETE FROM trafo.points_img WHERE trafo.points_img.gid NOT IN (SELECT ‘exists’ FROM schemaC.parcel.gid )
CONTEXT: PL/pgSQL function “polygonpoints” line 9 at SQL-Anweisung

Ich hab mir dann gedacht, dass ich die parcel.gid vielleicht als fremdschlüssel importieren muss, aber die würde ja öfters vorkommen, da ich ja mehrere Punkte pro polygon habe. ich hatte zuvor auch versucht beide zu verknüpfen, also die ausgelesenen parcelids und die neue gid von points_img, leider funktionierte das auch nicht so richtig!

Schon mal vielen Dank für jede Antwort! Und falls irgendwem etwas einfällt bin ich dankbar darum!!!

Wie sieht denn das vollständige CREATE FUNCTION für trafo.polygonpoints() aus?
Und: bitte verwende

 tags um den Source Code zu formatieren!

Nein, der Fehler ist ein anderer:

FEHLER: Verweise auf andere Datenbanken sind nicht implementiert: »schemaC.parcel.gid«
LINE 1: ...trafo.points_img.gid NOT IN (SELECT 'exists' FROM schemaC.p...
^
QUERY: DELETE FROM trafo.points_img WHERE trafo.points_img.gid NOT IN (SELECT 'exists' FROM schemaC.parcel.gid )

Ändere das mal in:

DELETE FROM trafo.points_img WHERE gid NOT IN (SELECT 'exists' FROM schemaC.parcel.gid )

PG sieht hier in foo.bar.bla vermutlich eine Referenz auf eine andere Datenbank, dies läßt die Fehlermeldung vermuten.

Probier es - und sag Bescheid, ob es das war.


Andreas

Vielen Dank für die Antwort und die Hilfe!

Hier die funktion:

-- Function: trafo.polygonpoints()

-- DROP FUNCTION trafo.polygonpoints();

CREATE OR REPLACE FUNCTION trafo.polygonpoints()
  RETURNS trigger AS
$BODY$


BEGIN


 INSERT INTO trafo.points_img (gid, parcelid, geom) 
        (SELECT nextval('trafo.seq_gid_points_img') as gid, a.parcelid, a.geom FROM (SELECT b.gid as parcelid,(my_ST_DumpPoints(geom)).* as geom FROM cadastre.parcel as b)as a);

DELETE FROM trafo.points_img WHERE gid NOT IN (SELECT 'exists' FROM cadastre.parcel.gid );
	

RETURN NEW;

END;

$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;
ALTER FUNCTION trafo.polygonpoints() OWNER TO postgres;

Ich habs mal versucht mit dem gid, das hat leider nicht funktioniert… weiterhin die gleiche fehlermeldung… ?

Ich vermute nach wie vor das Problem in dem Subselect zum Delete. Um das noch mal zu zeigen:

test=# create table foo(i int);
CREATE TABLE
test=*# select 1 from foo;
 ?column?
----------
(0 rows)

test=*# select 1 from public.foo;
 ?column?
----------
(0 rows)

test=*# select 1 from public.foo.i;
ERROR:  cross-database references are not implemented: "public.foo.i"
LINE 1: select 1 from public.foo.i;

Andreas

Ja, ich denke du hast recht, es liegt an dem DELETE FROM …

allerdings hab ichs mit dem ‘NOT IN’ auch nciht hin bekommen… hab jetzt schon unzählige versionen durchprobiert… momentan bin ich bei

DELETE FROM trafo.points_img USING schemaC.parcel WHERE parcelid = old.gid;

Das ganze wird aufgerufen, wenn tg_op = ‘DELETE’ zutrifft… Seitdem kommt die Fehlermeldung mit den Verweisen auf andere Datenbanken nciht mehr. Allerdings löscht es die Punkte auch nicht!

Ich glaube, Du verstehst mich nicht…

DELETE FROM trafo.points_img WHERE gid NOT IN (SELECT 'exists' FROM cadastre.parcel.gid );

Was soll cadastre.parcel.gid sein? Schema cadastre, Tabelle parcel, Spalte gid? Im FROM muß eine Tabelle stehen, keine Spalte. Daher ‘vermutet’ PG, Du meinst Datenbank: cadastre, Schema parcel, Tabelle gid. Und exakt das, nämlich ein Zugriff auf andere Datenbanken, geht nicht.

Andreas

ok, entschuldige, wenn ich mich zu undeutlich ausgedrückt habe…

trafo = schema
cadastre = schema

points_img = tabelle
parcel = tabelle

gid = spalte
parcelid = spalte

von daher dürfte das ja nicht das problem sein, denn beim FROM steht eine Tabelle.

Wenn du die betreffende(n) ID(s) nimmst und damit ein SELECT ausführst, bekommst du die zu löschenden Ergebnisse?

Debugging in deinen Funktionen ist mittels RAISE NOTICE möglich.

Ok, das war gut! Vielen dank, habs jetzt hin bekommen mit folgendem:

DELETE FROM trafo.points_img WHERE parcelid NOT IN (SELECT c.gid FROM cadastre.parcel c);

das war ein guter tipp es zunächst mit dem select zu versuchen!