Page 1 of 1

Trigger funktion driller med INSERT i QGIS

Posted: Fri 27. Mar 2020 07:58
by Roman Varinsky
Jeg er i gang med at optimere vores Postgres database og jeg bruger mange gode idéer fra FKG-databasen. Jeg har allerede en del basis-tabeller med tilhørende kode-tabeller, der oversætter koderne i tilsvarende views. Jeg vil gerne udstille views'ene til mine brugere.

De er ikke i sig selv redigerbare, men det kan man løse ved en trigger funktion á la denne:

Code: Select all

CREATE OR REPLACE FUNCTION administration.skoler_dagtilbud_trg()
    RETURNS trigger AS $$
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
    BEGIN                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
       IF (TG_OP = 'DELETE') THEN                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
                      DELETE FROM administration.skoler_dagtilbud where ogc_fid=OLD.ogc_fid;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
                      RETURN OLD;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
       ELSIF (TG_OP = 'UPDATE') THEN                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
                      UPDATE administration.skoler_dagtilbud set udd_institution_type_kode=NEW.udd_institution_type_kode, ejerstatus_kode=NEW.ejerstatus_kode, udd_institution_navn=NEW.udd_institution_navn, starttrin_kode=NEW.starttrin_kode, sluttrin_kode=NEW.sluttrin_kode, link=NEW.link, geometry=NEW.geometry, senest_opdateret=NEW.senest_opdateret, bruger_id=NEW.bruger_id                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
                      WHERE ogc_fid=OLD.ogc_fid;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
                      RETURN NEW;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             

       ELSIF (TG_OP = 'INSERT') THEN                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
                      NEW.ogc_fid:=nextval('administration.skoler_dagtilbud_id_seq'::regclass);
                      INSERT INTO administration.skoler_dagtilbud VALUES (NEW.ogc_fid,NEW.udd_institution_type_kode, NEW.ejerstatus_kode, NEW.udd_institution_navn, NEW.starttrin_kode, NEW.sluttrin_kode, NEW.link, NEW.geometry, NEW.senest_opdateret, NEW.bruger_id);                                                                                                                                                                                                                                                                                                                                                                                                             
                      RETURN NEW;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
       END IF;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
   END;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
 $$ LANGUAGE plpgsql;
 
 
 CREATE TRIGGER skoler_dagtilbud_v_trg_iud
    INSTEAD OF INSERT OR DELETE OR UPDATE 
    ON administration.skoler_dagtilbud_v
    FOR EACH ROW
    EXECUTE PROCEDURE administration.skoler_dagtilbud_trg(); 

 
Alle funktionerne virker egentlig ok, men jeg har udfordring med INSERT-delen, da QGIS ikke lige godtager ogc_fid-sequencen fra tabelen. Med denne opsætning kan jeg godt tilføje et nyt objekt, men skal manuelt tilføje dets ogc_fid. Dette ville jeg gerne tage fra tabellens sequence. Jeg har googlet, tjekket Postgres-undervisningen og opsætningen af FKG-triggers samt prøvet forskelligt, men kan ikke lige knække den.
qgis INSERT.jpg
Har nogen måske haft den samme udfordring og har en idé?

Mvh Roman