2017-03-29 5 views
0

Ich habe ein Entity-Relationship-Modell, in dem ich versuche, die Normalisierungsregeln zu respektieren. Um jedoch über PostGIS in QGIS zu arbeiten und aktuell nur relevante Daten zu haben, möchte ich einige Ansichten durcharbeiten, diese in QGIS anzeigen und ggf. die entsprechende Tabelle entsprechend den vorgenommenen Änderungen aktualisieren.Aktualisierung von Tabellendaten aus PostgreSQL/PostGIS

Zum Beispiel habe ich drei Tabellen, wo Kabel ist das, das die Daten enthält mit denen ich arbeiten muss, modele_cable eine Referenztabelle (schwache Entität) mit einigen Informationen, die die Ansicht füllen würde, und type_cable eine schwache Entität von modele_table, auch einige relevante Informationen in der Ansicht enthalten. Als solche:

CREATE TABLE test.cable(
     id_cable serial NOT NULL, 
     id_modele_cable integer, 
     geom geometry(MultiLineString,2154), 
     CONSTRAINT prk_constraint_cable PRIMARY KEY (id_cable), 
     CONSTRAINT fk_cable_id_modele_cable FOREIGN KEY (id_modele_cable) 
      REFERENCES test.modele_cable (id_modele_cable) 
    ); 
    CREATE TABLE test.modele_cable(
     id_modele_cable serial NOT NULL, 
     id_type_cable integer, 
     CONSTRAINT prk_constraint_modele_cable PRIMARY KEY (id_modele_cable), 
     CONSTRAINT fk_modele_cable_id_type_cable FOREIGN KEY (id_type_cable) 
      REFERENCES test.type_cable (id_type_cable) 
    ); 
    CREATE TABLE test.type_cable(
     id_type_cable serial NOT NULL, 
     nb_fo integer, 
     CONSTRAINT prk_constraint_type_cable PRIMARY KEY (id_type_cable) 
    ); 
    CREATE VIEW public.cable_ok AS 
    SELECT cable.id_cable, 
     cable.designation, 
     type_cable.nb_fo, 
     cable.geom 
     FROM test.cable 
     LEFT JOIN test.modele_cable ON cable.id_modele_cable=modele_cable.id_modele_cable 
     LEFT JOIN test.type_cable ON type_cable.id_type_cable=modele_cable.id_type_cable; 

fand ich keine Informationen darüber, wie zu tun, was ich will, noch, ob es überhaupt möglich ist, und wenn nicht, was könnte eine Abhilfe sein. Ich habe versucht, einen Trigger zu machen, der die Änderung in der Ansicht in PostGIS erkennen und die Tabelle 'cable' entsprechend aktualisieren würde, aber ich habe es nicht geschafft (ich habe erfolgreich nur einmal einen Trigger in einem anderen Kontext erstellt, und zwar ziemlich schmerzlich). Ich habe auch festgestellt, dass es nicht möglich ist, eine Ansicht manuell in der Tabelle der Ansicht zu aktualisieren (was logisch klingt, da es sich um eine Ansicht handelt).

Hat jemand irgendeine Ahnung, Richtung, Hilfe, Erfahrung, die mir helfen könnte, dieses Problem zu lösen?

UPDATE hier ist ein Auslöser, wie ich es umzusetzen versucht:

create or replace function tout.update_cable_view() returns trigger as 
    $body$ 
    begin 
    select modele_cable.id_modele_cable 
    into cable.id_modele_cable 
    from test.cable 
    inner join test.modele_cable on cable.id_modele_cable=modele_cable.id_modele_cable 
    inner join test.type_cable on modele_cable.id_type_cable=type_cable.id_type_cable, 
    public.cable_ok 
    where cable_ok.nb_fo=type_cable.nb_fo; 
    return null; 
    end; 
    $body$ 
    language plpgsql; 

    create trigger t_update_cable_view 
    instead of insert or update on public.cable_ok 
    for each row 
    execute procedure tout.update_cable_view(); 

UPDATE 2 hier ist eine Triggerfunktion, die arbeiten sollte, ist aber nicht:

create or replace function tout.update_cable_view() returns trigger as 
$body$ 
begin 
update test.cable 
set id_modele_cable = (select id_modele_cable from test.modele_cable 
inner join test.type_cable on 

modele_cable.id_type_cable=type_cable.id_type_cable 
    where new.nb_fo=type_cable.nb_fo and old.id_cable=new.id_cable); 
return new; 
end; 
$body$ 
language plpgsql; 
+1

Ich bin mir nicht sicher, was Sie wollen. Eine [aktualisierbare Ansicht] (https://www.postgresql.org/docs/current/static/rules-views.html#RULES-VIEWS-UPDATE)? Wenn ja, hast du versucht, einen "INSTEAD OF" -Trigger dafür zu schreiben, aber gescheitert? Bitte fügen Sie mehr Kontext und Ihre fehlgeschlagenen Versuche hinzu. – pozs

+0

Ich möchte, dass, wenn ich einige Informationen in der Ansichtsebene in QGIS aktualisiere, oder wenn ich ein neues Tupel erzeuge oder eines in der Ansicht in QGIS lösche, die Tabelle 'Kabel' entsprechend aktualisiert wird. Ich habe meinen ursprünglichen Beitrag mit einem fehlgeschlagenen Versuch eines Triggers bearbeitet, den ich zu implementieren versuchte. Ich schätze ein großes Problem ist, dass es keine 'neue' Variable in der Trigger-Funktion gibt ... –

+0

Die 'NEW''-Zeile wird auch in den' INSTEAD OF'-Triggern definiert. Vielleicht möchten Sie auch 'RETURN NEW' ([statt' NULL'] (https://www.postgresql.org/docs/current/static/plpgsql-trigger.html) - * 'INSTEAD OF'-Trigger können Gibt null zurück, um zu signalisieren, dass sie keine Aktualisierungen durchgeführt haben und dass der Rest der Operation für diese Zeile übersprungen werden sollte *) - Sie sollten wirklich ** nicht ** "AUSWÄHLEN" von der Ansicht, die eingefügt/aktualisiert wird . – pozs

Antwort

0

Ich habe einen anderen Weg gefunden, mit einer Regel zu tun, was ich wollte. Ich nehme an, dass PostgreSQL das Speichern der Ansicht nicht erlaubt. Mit einer INSTEAD Regel versucht es nicht, die Ansicht zu speichern und aktualisiert stattdessen die ursprüngliche Tabelle und aktualisiert dann automatisch die Ansicht. Hier ist das Stück Code, für ein Update:

create rule "_test_rule" as 
on update to public.cable_ok 
do instead update test.cable 
set id_modele_cable = (select id_modele_cable from test.modele_cable 
inner join test.type_cable on modele_cable.id_type_cable=type_cable.id_type_cable 
where new.nb_fo=type_cable.nb_fo and new.id_cable=cable.id_cable) 
where old.id_cable=cable.id_cable; 
Verwandte Themen