Update einer Tabelle mittels View

Hallo Forum,
ich habe eine Haupttabelle und dazu zwei verschiedene Views, nun möchte ich das diejenigen die die Views sehen diese Daten auch verändert werden können, wie kann ich das bewerkstelligen?
mfg
ballibum

Du kannst passende RULEs auf den VIEW legen.

Dem ads merkt man an, daß er Urlaub und damit wichtigeres zu tun hat als mal ein kurzes Beispiel zu liefern, also bleibt das mal wieder bei mir hängen…

test=# create table demo (i int);
CREATE TABLE
Zeit: 182,168 ms
test=*# create view view_demo as select * from demo;
CREATE VIEW
Zeit: 7,290 ms
test=*# create rule demo_rule as on update to view_demo do instead update demo set i = new.i;
CREATE RULE
Zeit: 0,550 ms
test=*# select * from demo;
 i
---
(0 Zeilen)

Zeit: 0,836 ms
test=*# insert into demo (i) values (10);
INSERT 0 1
Zeit: 0,283 ms
test=*# select * from view_demo;
 i
----
 10
(1 Zeile)

Zeit: 0,258 ms
test=*# update view_demo set i = 20 where i=10;
UPDATE 1
Zeit: 0,453 ms
test=*# select * from demo;
 i
----
 20
(1 Zeile)

Zeit: 0,268 ms

Andreas

vielen dank für die information, leider scheint das noch nicht zu klappen, ich habe einen view mit 3 Spalten, für die ich jeweils eine rule erzeugt habe. nun greife ich auf diesen view mit einem programm (quantum gis) zu, beim abspeichern kommt folgende fehlermeldung:

ERROR: cannot insert into a view
TIP: You need an unconditional ON INSERT DO INSTEAD rule.

kann mir dazu jemand etwas sagen?oder noch einen tip geben?

hier der sql code den ich benutzt habe:

view:

CREATE  VIEW demo3 AS 
 SELECT nutzungrfh.gid, nutzungrfh.the_geom, nutzungrfh.objectid
   FROM nutzungrfh;
ALTER TABLE demo3 OWNER TO postgres;

und für die regeln:

create rule demo1 as on update to demo do instead update nutzungrfh set gid = new.gid;
create rule demo2 as on update to demo do instead update nutzungrfh set objectid = new.objectid;
create rule demo3_rule as on update to demo do instead update nutzungrfh set the_geom = new.the_geom;

die urrsprüngliche tabelle hat natürlich deutlich mehr spalten, diese sollen jedoch leer bleiben.
vielen dank für eure hilfe

Natürlich. Du brauchst eine Rule für INSERT. Steht übrigens auch als TIP in der Fehlermeldung.

Andreas

Oh Mann, entschuldigung das ich euch mit solchen Fehlern behelligt habe, dennoch vielen Dank für deine/eure Hilfe.

Guten Abend in’s Forum,

ich beschäftige mich mit dem Aufbau einer Datenbank, die ich ich momentan noch auf zwei Systemen parallel erstelle. MariaDB und Postgres. Jetzt bin ich bei den Views auf die Hürde gestoßen, dass ich in Postgres über die view die Tabelle nicht erweitern bzw. updaten konnte. Mei MariaDB geht das problemlos.
Nach einigem Suchen bin ich hier gelandet. Und so wie ich das verstehe kann man schon über eine view die Tabelle “manipulieren”, wenn man entsprechende Regeln für die view definiert. Verstehe ich das richtig?

Muß man in der Regel jede einzelne Spalte angeben die geändert werden soll oder gibt es nicht einen “Pauchalbefehl” der die view “freischaltet” für Insert und Update?

Vielen Dank für Eure Hilfe und viele Grüße
PGThustra

Das hängt von der View ab. Für “einfache” Views muss man nichts weiter machen, die sind direkt änderbar (INSERT, UPDATE, DELETE). Für Views die z.B. joins oder Aggregate verwenden muss man die entsprechenden RULEs schreiben. Aber nur eine pro Aktion, nicht eine pro Spalte.

Hier ist ein Beispiel: Postgres 13 | db<>fiddle

Hallo castrop,

vielen Dank für Dein Beispiel.

Ich habe das Problem unter pgAdmin4, dass ich über die view nach “view/edit Data -->All Rows” bei der folgenden tabellarischen Ansicht der Daten nur lesenden Zugriff habe. Die Ansichtstabelle lässt kein editieren zu.

Die View ist voll update-fähig - das ist ein Problem des Tools (pgAdmin) nicht ein Postgres Problem.

Das ist unterm Strich das gleiche Problem wie hier: https://www.pg-forum.de/t/pgadmin-read-only-weg-machen-ohne-pk

Vielen Dank für den Hinweis. Nachdem ich Stunden probiert habe kamen mir Zweifel…

Lässt sich das unter pgAdmin4 irgendwie abstellen?

Du nutzt wohl kein pgAdmin so wie ich das den Beiträgen des Link entnommen habe. Darf ich fragen mit was Du arbeitest?

Wie unterschiedlich hier doch die “Backends” reagieren. Zum Vergleich zu pgAdmin habe ich mir noch Postico und DBeaver installiert.

Postico lässt für einfache views die Bearbeitung zu. Bei den komplizierteren mit “LEFT JOIN” verlangt es Regeln.

DBeaver gibt bei den einfachen views den Hinweis alle Spalten zunächst UNIQUE zu deklarieren (wenn ich das richtig verstanden habe) und lässt dann auch die Bearbeitung zu. Bei den komplizierteren hab’ ich es nicht probiert.
Aber es hat mich auf die Idee gebracht unter pgAdmin eine Spalte der view UNIQUE zu deklarieren. Das bekomme ich nicht hin.

Fazit für mich: Ich kann unter pgAdmin nicht ausprobieren ob die Regeln auf (m)eine view funktionieren. Und ich brauche (gerade as Anfänger) mehr wie ein Verwaltungstool.

Viele Grüße

Natürlich kannst Du das: einfach INSERT bzw. UPDATE Befehle ausführen und sehen ob es einen Fehler gibt.

O.K. Zugegeben, an Konsolenbefehle hab’ ich jetzt nicht gedacht. Ich meinte über die GUI bzw. mit Doppelklick in die Gitterzelle um den Wert zu ändern und zu übernehmen.