Wie sieht denn das vollständige CREATE FUNCTION für trafo.polygonpoints() aus?
Und: bitte verwende [code] tags um den Source Code zu formatieren!
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 [code] tags um den Source Code zu formatieren!
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'
Nein, der Fehler ist ein anderer:
Ändere das mal in:Code: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 )
PG sieht hier in foo.bar.bla vermutlich eine Referenz auf eine andere Datenbank, dies läßt die Fehlermeldung vermuten.Code:DELETE FROM trafo.points_img WHERE gid NOT IN (SELECT 'exists' FROM schemaC.parcel.gid )
Probier es - und sag Bescheid, ob es das war.
Andreas
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Vielen Dank für die Antwort und die Hilfe!
Hier die funktion:
Ich habs mal versucht mit dem gid, das hat leider nicht funktioniert... weiterhin die gleiche fehlermeldung... ?Code:-- 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 vermute nach wie vor das Problem in dem Subselect zum Delete. Um das noch mal zu zeigen:
Code: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
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
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
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!Code:DELETE FROM trafo.points_img USING schemaC.parcel WHERE parcelid = old.gid;
Ich glaube, Du verstehst mich nicht...
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.Code:DELETE FROM trafo.points_img WHERE gid NOT IN (SELECT 'exists' FROM cadastre.parcel.gid );
Andreas
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
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.
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören
Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler
PostgreSQL Service & Support
Ok, das war gut! Vielen dank, habs jetzt hin bekommen mit folgendem:
das war ein guter tipp es zunächst mit dem select zu versuchen!Code:DELETE FROM trafo.points_img WHERE parcelid NOT IN (SELECT c.gid FROM cadastre.parcel c);
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen