2016-07-29 34 views
0

ich arbeite in PostgreSQL 9.5, wo ich diese beiden Tabellen haben:Trigger-Funktion aktualisiert nicht die erste Zeile der Tabelle

Tabelle Vorfall:

oid integer 
    description integer, 
    geom geometry(Point,4326), 

Und Tabelle Gitter:

oid integer, 
    number integer, 
    geom geometry(Polygon,4326) 

Jedes Mal, wenn ein Punkt zur Tabelle Vorfall hinzugefügt wird Ich möchte das Feld Beschreibung mit der Grid-Nummer gefüllt werden, die der Punkt schneidet. Um dies zu erreichen habe ich diese Trigger:

CREATE OR REPLACE FUNCTION get_ortofoto_incidentes() 
    RETURNS TRIGGER AS 
$BODY$ 
    BEGIN  
     SELECT g.number INTO NEW.description 
     FROM incident AS i, grid AS g 
     WHERE st_intersects(new.geom, g.geom) ; -- 
RETURN NEW; 
    END; 
$BODY$ 
    LANGUAGE 'plpgsq; 

Und fügte hinzu, es auf den Tisch Vorfall:

CREATE TRIGGER get_ortofoto_incidentes 
    BEFORE INSERT OR UPDATE ON incidentestest 
    FOR each row 
    EXECUTE PROCEDURE get_ortofoto_incidentes(); 

Das Problem ist, dass, wenn die Trigger-Funktion das Attribut Beschreibung genannt wird bleibt null für die erste Zeile, aber nach dem Trigger funktioniert wie erwartet. Dies ist, was ich bekomme:

oid | description 
1 | null 
2 | 236541 
3 | 695489 
4 | 325687 
... | .... 

Eine Idee, warum der Trigger nicht für die erste Zeile der Tabelle aktualisiert wird?

Danke

Antwort

1

Ich würde sagen, dass es ein Zufall ist, dass dies nur für die erste Zeile eingefügt passiert. Es ist vollkommen in Ordnung, description auf NULL zu setzen, wenn die erste übereinstimmende Zeile in gridNULL in number hat.

Ich möchte auch Sie warnen, dass die Abfrage in Ihrer Trigger-Funktion ein kartesisches Produkt zwischen den passenden Zeilen aus grid baut und den Tisch incident, da es keine WHERE Zustand der letzteren zu beschränken. Entfernen Sie die incident AS i aus der Abfrage.

+0

Danke Laurenz, guter Punkt auf der "Vorfall AS i". Ich habe es entfernt und jetzt funktioniert der Trigger wie erwartet auch für die erste Zeile. Obwohl ich Ihren Standpunkt verstehe, bin ich nicht sicher, warum es mein Problem verursacht hat, aber Tatsache ist, es funktioniert! – Lisdengard