Create view viewname

Moin, ich habe eine Tabelle mit Flurstücksdaten und habe dazu einen View geschrieben:
*create or replace view q_gemeinden as select geom, art, name, ags, uebobjekt, ueboname from gemeinden join aktuell on (ags = fkey);
Ich bin kein Experte, muss ich dazu sagen. Aber der View funktioniert in der DB-verwaltung von Qgis und in Pg-Admin.
Ich würde gerne den Namen des Views aus der ersten Zeile einer Tabellenspalte übernehmen. Wie könnte so etwas aussehen?
Vielleicht hat jemand einen Tipp. Ich würde mich freuen.

Hallo Nilsson,

richtig verstanden: ich Du möchtest den View Namen über einen Tabelleninhalt definieren?
Das geht innerhalb postgres nicht ohne weiteres. Es gibt dafür mglw. eine Extension. Stichwort ist “dynamisches SQL”. Also SQL das anhand existierender Daten erst erzeugt wird.

Am einfachsten ist es wahrscheinlich, solche Sachen per Script zu machen, also von außen. Oder über einen programmierten Client.

Auch ist es wichtig, sich zu überlegen, warum man das machen will. Gibt es eine Notwendigkeit? Wie erfolgt anschließend die Nutzung?
Angenommen Du erschaffst diesen View, der nach einem Feldwert benannt wird, wer kann ihn dann mit welchem Tool nutzen? Das Tool müsste auf irgendwelchen Wegen Kenntnis von dem View haben. Dass er plötzlich da ist, wie er genannt wird natürlich und welche Spalten enthalten sind.
Hast Du dazu keinen Plan, nützt Dir ein dynamischer View nichts.
Erst wenn die Nutzung dynamischer DB Objekte auf ähnlichem Weg erfolgt, wie die Erstellung der dynamischen Objekte, ergibt das Ganze viel Sinn.
Neben der Frage, wie geht das, steht jedenfalls auch die Frage, was nützt es?

Fast richtig, man kann es mit pl/pgsql machen, siehe PostgreSQL: Documentation: 15: 43.5. Basic Statements

Allerdings ergibt das auch mit viel Fantasie keinen Sinn. Welches Problem soll damit gelöst werden?

1 „Gefällt mir“

Execute hatte ich jetzt gar nicht dran gedacht.
Ich meine es gäbe extra Pakete dafür.
Ist ja auch eine Sache, mit Execute DML abzufeuern und ne andere DDL Statements.

Naja, vielleicht erklärt ja @Nilsson noch, was er überhaupt erreichen will.

Übrigens, kleiner Hinweis: Da Deine Abfrage kein ORDER BY enthält, besteht die gute Chance, daß wenn die Abfrage mehr als 1 Zeile liefert, die Reihenfolge der Zeilen unterschiedlich sein kann - selbst wenn sich die Daten selbst nicht ändern.

Erst mal danke für Eure Unterstützung!
Ich möchte Flurstücksdaten in einer Postgresdatenbank ablegen und die auf Gemeindeebene wieder abfragen können. Die Daten sollen für weitere Nutzer zur Verfügung stehen. Die sollen im QGIS die Abfrage ausführen können, ohne SQL anwenden zu müssen. Daher sollen die in einer weiteren Tabelle nur Ihren Benutzernamen und die Gemeinde auswählen und dann soll automatisch die Abfrage mit dem Benutzernamen und dem Text Flurstuecke als Name der Abfrage erfolgen. Da die Datenbank nicht nur aus den Flurstuecken, sondern weiteren Tabellen wie z.B. den Flurstuecksnummern, Gebaeuden, Katasterbezirken und der Nutzung. Solange ich die Daten alleine Nutze funktioniert das gut, nur wenn es mehrere Benutzer gleichzeitig sind, die Daten über meinen View abfragen wollen, geht das so nicht mehr. Vielleicht ist meine Vorstellung, wie man das umsetzen könnte auch falsch?

Hallo akretschmer, danke für den Tipp. Ich möchte noch erwähnen, daß meine Überlegung für die DB ist, dort nach und nach die Daten für ganz Schleswig-Holstein abzulegen. Nach und nach, so wie wir die brauchen.

Ich würde sagen ja. Das ist eine sehr komplizierte Idee und passt überhaupt nicht zu einer wachsenden Zahl von Benutzern und den Verfahren / Konzepten von Datenverarbeitung.
Was machst Du mit Reports, die bestimmte Daten ziehen / anzeigen. Auch für jeden Benutzer / Gemeinde einzeln? Was machst Du mit Benutzern, die mehreren Gemeinden zugeordnet sind?

Der Zugriff auf ein Daten oder Ausschnitte davon muss im Datenmodell geregelt sein. Benutzer bekommen also einen Scope, der sie zu bestimmten Datenmengen berechtigt, auf Gemeindeebene oder wie auch immer. Dazu müssen Nutzern bei der Registrierung diese Bereich zugeordnet werden und später auch änderbar sein.

Hallo pogomips, die Benutzer fragen immer nur eine Gemeinde ab. Im wesentlichen geht es nur darum, daß ein Benutzer die Tabelle mit dem Benutzernamen aufrufen, dort dann ihren Benutzernamen und den Gemeindeschlüssel auswählen und als Ergebnis die Gemeinde mit den Flurstücken im QGIS angezeigt bekommen. Danach erstellen die daraus eine dxf und das wars dann auch schon. Es wird nicht gespeichert. Das soll nur eine Möglichkeit sein, schnell und einfach die Alkis- Daten in eine Dwg zu bekommen. Den Import der Daten mache ich selbst oder vielleicht später noch ein oder zwei weitere Kollegen. Das machen wir auch mit QGIS mit dem GDAL-Werkzeug, da wir alle wenig bis garnichts von Postgres verstehen. Das ist Stand heute. Wir haben sonst das Norgis-Alkis benutzt. Das funktioniert auch perfekt. Das Problem ist nur, dass das LVermgeo SH NAS- Daten nur auf Flurweise bereitstellt. Über den Atomfeed-Viewer bekommen wir vereinfachte Daten im WFS-Xml- Format für ganze Gemeinden. Das spart sehr viel Zeit und die vereinfachten Daten reichen uns in vielen Fällen.

Die Formate sagen mir nichts. Aber das ist auch egal.
Was meinst Du mit “Tabelle mit Benutzername aufrufen”?
Wenn ich mich irgendwo anmelde, ob direkt in einer DB oder in einer Weboberfläche, bin ich mit dem Benutzernamen bereits bekannt.
Ich muss also nichts auswählen, was das System eh schon weiß.
Vielleicht, und das ist nicht selten, darf ich auch nichts auswählen, was “nicht meins” ist.

Nimm facebook oder irgendwas anderes, es gibt Daten, die nur Du sehen kannst. Das wären dann wohl Eure Gemeindedaten.
Die stehen dennoch in einer(!) Tabelle. Allgemein gibt es dann Zuordnungstabellen, wo Verweise geführt werden.

BenutzerID, GemeindedatenID
1, 1
2, 1
3, 2

Benutzer 3 darf die Daten von Gemeinde 2 sehen, Benutzer 1 und 2 die von Gemeinde 1.

Dann gibt es eine Gemeindetabelle.
GemeindedatenID, Gemeindedaten
1,
2,

So oder ähnlich würde man das machen.

Ein View, wenn man einen möchte, würde beides verbinden und in der Nutzung/Anzeige jedem Benutzer nach seiner ID die zugeordneten Gemeindedaten anzeigen.
Nur ein View, nur ein Namen für einen View. Die Anzeige wird dann immer nach User ID gefiltert.

Hallo pogoimps, vielen Dank für Deine Hilfe. Vielleicht ist das eher eine QGIS Frage. Ich hatte die Hoffnung, daß es die Möglichkeit gibt, den Namen für einen View im PG-Admin über eine Unterabfrage (oder ähnliches) zu generieren. Damit wäre mein Problem gelöst gewesen, denn ansonsten funktioniert alles gut. Ich nehme also mit, daß man den Namen für einen View nur händisch eingeben kann. Damit ist meine Frage beantwortet. Was Du mit

meinst, verstehe ich leider nicht. Ich denke, dafür fehlen mir insgesamt die Kenntnisse, dass hatte ich ja schon erwähnt. In diesem Fall handelt es sich um frei verfügbare Daten, die jeder sehen kann, wenn er möchte. Die Datenbank steht auch nur in einem Intranet zur Verfügung.
Danke nochmal für Deine Mühe!
Gruß…

Nein, einen View anzulegen ist keine QGIS Frage.
Du kannst einen View per Postgres anlegen, ich hatte an etwas anderes gedacht und meine Auskunft war nur “fast richtig”, wie @akretschmer oben schrieb:

Das sollte eigentlich eine leicht verständliche Benutzererfahrung sein, als Hinweis darauf, dass ein x beliebiges System sowieso bereits den Benutzer kennt, per Anmeldung. Egal.

Ich verstehe nicht, was Du da bauen willst, aber Du kannst es machen, siehe zitierten Link PG 15 Doku, Kapitel 43.5 zu Execute.

postgres=# select * from geo_nilsson;
FEHLER:  Relation »geo_nilsson« existiert nicht
ZEILE 1: select * from geo_nilsson;
                       ^
postgres=# do $$
postgres$# declare
postgres$#     viewname varchar(100) := 'geo_nilsson';
postgres$#
postgres$# begin
postgres$#
postgres$# EXECUTE format(' create or replace view %I as
postgres$#         select version(),now()', viewname);
postgres$# end $$;
DO
postgres=# select * from geo_nilsson;
 version                                             | now  
-----------------------------------------------------+-------
 PostgreSQL 12.2, compiled by Visual C++ build 1914 | 2023-02-12 08:47:20
(4 rows)  
postgres=#

Klingt so, als ob Du da auch RLS (Row Level Security) nehmen könntest: Du hast eine Spalte mit dem Nutzernamen, und eine Regel, die dann besagt: Nutzer A sieht alle Rows, wo dort A steht. Nutzer B sieht alle Rows mit B, … und so weiter.

Hallo pogoimps und akretschmer, danke, dass ihr Euch soviel Mühe gebt mir zu helfen. Leider reichen meine Kenntnisse bei weitem nicht aus, für dass was Ihr mir zu vermitteln versucht. Ich hatte geglaubt, es gäbe für meine Frage eine einfache Lösung. Ich habe von Scripten usw. keine Ahnung. Ich kann ein bißchen Sql, das ist alles. Das sind aber nicht mal Grundkenntnisse. Alles was ich so brauche, google ich mir zusammen oder ich schaue mal in mein PostgreSQL für Einsteger Buch. Ich kann leider mit zwei drei Worten nicht erklären, was ich mache.
Ganz grundsätzlich: QGIS ist ein GIS- System. Im QGIS kann ich mich mit einer Postgis- datenbank verbinden, Tabellen und View’s laden und auch schreiben. Über einen DB- Manager kann ich auch direkt SQL- Code eingeben. Eine Tabelle oder ein View entsprechen im QGIS einem Kartenlayer. Man kann Daten mit oder ohne Geometrie verarbeiten. In meiner DB gibt es verschiedene Tabellen mit Liegenschaftsdaten. Z.B. flurstuecksgrenzen (Polygon), flurstuecksnummern (Punkt), gebaeude (polygon), katasterbezirk (polygon), nutzung_flurstueck (polygon), strassen (Linen, stammen aus der OpenStreetMap) usw. Außerdem habe ich mir eine Tabelle erstellt, die heißt “aktuell”. In dieser Tabelle gibt es nur eine Zeile, mit den Spalten fid und gmdschl (Gemeindeschlüssel). Brauche ich die Daten von einer bestimmten Gemeinde, wähle ich in der Spalte “gmdschl” die Gemeinde aus (bzw. funktioniert das über eine Vervollständigung), wird in der Spalte der Gemeindeschlüssel gespeichert. Der View dazu gleicht den Gemeindeschlüssel aus der Tabelle aktuell mit der Tabelle flurstuecke ab, wo es ebenfalls eine Spalte “gmdschl” gibt und gibt dann die Daten der abgefragten Gemeinde zurück. Das funktioniert, solange nur ein Benutzer Daten abfragt. Fragen mehrere Nutzer die Daten gleichzeitig ab, geht das nicht mehr. Da ich pro Gemeinde 5 oder mehr Tabellen habe und würde beispielsweise 20 Benutzer haben, müsste ich für jeden Benutzer 5 oder mehr Views anlegen, damit es nicht zu Problemen kommt. Das wollte ich mir sparen, indem der Name für den View automatisch nach dem Benutzer benannt wir. Also z.B. flurstuecke_heinz, flurstuecke_gustav usw. Dazu hatte ich eine weitere Spalte mit dem Benutzernamen in der Tabelle aktuell angedacht. So würde ich dann keine zusätzlichen Daten erzeugen und man lädt nicht jedes mal alle Gemeinden, sondern nur die, die man benötigt.

Dein View ist ja derzeit:

create or replace view q_gemeinden as select geom, art, name, ags, uebobjekt, ueboname from gemeinden join aktuell on (ags = fkey);

Welches Feld ist in der Tabelle gemeinden? ags oder fkey? Nennen wir es mal feld, und in aktuell steht in dem Feld ‘Hans’ Ein View für Hans wäre:

create or replace view q_gemeinden_hans as select geom, art, name, ags, uebobjekt, ueboname from gemeinden where feld = 'hans';

Du hättest nun einen View für Hans, der sich view q_gemeinden_hans nennt. Das machst Du für die anderen Hanseln auch noch - fertig.

Ich habe den Verdacht, Du musst deine Views nicht dynamisch bauen. Immer nur, wenn ein neuer User angelegt wird.
Hatte was auf db_fiddle gemacht, aber das war gestern abgeschmiert und futsch.

in etwa, um mal rauszufinden, was Du kannst und brauchst:


create table gmdschl_filter (user_name varchar(63), gmdschl int);
insert into gmdschl_filter values('nilsson', 1234),('pogomips',4711);

create table flurstuecksgrenzen (id serial, flurstueck varchar(200), gmdschl int, geodaten text);
insert into flurstuecksgrenzen (flurstueck , gmdschl , geodaten ) values
('bla', 1234, 'irgendwelche geodaten von diesem Flurstück'),('bla', 1234, 'irgendwelche geodaten von diesem Flurstück'),
('bla', 1234, 'irgendwelche geodaten von diesem Flurstück'),
('bla', 2222, 'irgendwelche geodaten von diesem Flurstück'),('bla', 2222, 'irgendwelche geodaten von diesem Flurstück'),
('bla', 2222, 'irgendwelche geodaten von diesem Flurstück'),('bla', 2222, 'irgendwelche geodaten von diesem Flurstück'),
('bla', 4711, 'irgendwelche geodaten von diesem Flurstück'),
('bla', 4712, 'irgendwelche geodaten von diesem Flurstück');

create or replace view v_flurstueck_grenze_nilsson as 
select fg.* from 
  flurstuecksgrenzen fg join gmdschl_filter f 
  on fg.gmdschl = f.gmdschl 
 where f.user_name = 'nilsson';

create or replace view v_flurstueck_grenze_pogomips as 
select fg.* from 
  flurstuecksgrenzen fg join gmdschl_filter f 
  on fg.gmdschl = f.gmdschl 
 where f.user_name = 'pogomips';


  select * from v_flurstueck_grenze_pogomips ;
  
  select * from v_flurstueck_grenze_nilsson ;
  
 update gmdschl_filter set gmdschl = 2222 where user_name = 'nilsson';
 select * from v_flurstueck_grenze_nilsson ;

Dieses Thema wurde automatisch 60 Tage nach der letzten Antwort geschlossen. Es sind keine neuen Antworten mehr erlaubt.