Ergebnis 1 bis 10 von 10

Thema: Fehlermeldung bei DELETE FROM...

  1. #1
    anna_sql ist offline Neuer Benutzer
    Registriert seit
    07.09.2009
    Beiträge
    8

    Beitrag 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!!!

  2. #2
    castorp ist offline Erfahrener Benutzer
    Registriert seit
    27.06.2009
    Beiträge
    525

    Standard

    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?'

  3. #3
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von anna_sql Beitrag anzeigen
    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!!!
    Nein, der Fehler ist ein anderer:

    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 )
    Ändere das mal in:

    Code:
    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
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  4. #4
    anna_sql ist offline Neuer Benutzer
    Registriert seit
    07.09.2009
    Beiträge
    8

    Standard

    Vielen Dank für die Antwort und die Hilfe!

    Hier die funktion:

    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 habs mal versucht mit dem gid, das hat leider nicht funktioniert... weiterhin die gleiche fehlermeldung... ?

  5. #5
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von anna_sql Beitrag anzeigen
    Vielen Dank für die Antwort und die Hilfe!

    Hier die funktion:

    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 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:

    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
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  6. #6
    anna_sql ist offline Neuer Benutzer
    Registriert seit
    07.09.2009
    Beiträge
    8

    Standard

    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

    Code:
    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!

  7. #7
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von anna_sql Beitrag anzeigen
    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

    Code:
    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...
    Code:
    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
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  8. #8
    anna_sql ist offline Neuer Benutzer
    Registriert seit
    07.09.2009
    Beiträge
    8

    Standard

    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.

  9. #9
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.056

    Standard

    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

  10. #10
    anna_sql ist offline Neuer Benutzer
    Registriert seit
    07.09.2009
    Beiträge
    8

    Standard

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

    Code:
    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!

Ähnliche Themen

  1. Antworten: 4
    Letzter Beitrag: 20.09.2011, 09:06
  2. Delete
    Von Hansat im Forum SQL
    Antworten: 7
    Letzter Beitrag: 19.12.2010, 18:38
  3. Delete cascade?
    Von ratio im Forum Allgemeines
    Antworten: 5
    Letzter Beitrag: 01.07.2010, 12:59
  4. DELETE mit Unterabfrage
    Von Sharky im Forum SQL
    Antworten: 3
    Letzter Beitrag: 28.12.2009, 10:20
  5. DELETE kontrollieren
    Von inoup im Forum Trigger und Funktionen
    Antworten: 3
    Letzter Beitrag: 14.02.2006, 22:56

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum