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;
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
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 ... –
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