Notify an View hängen?

Hallo

ich möchte in einem Qt-Programm, welches eine Art Frontend darstellt, die Daten aus einem View darstellen. Dabei soll das Qt-Programm automatisch die angezeigten Daten anpassen, wenn sich der View ändert.

Ich dachte dabei daran, von der Datenbank bei Änderungen ein NOTIFY zu senden, da man sich mit QtSqlDriver auf NOTIFYs subscriben kann. Aber wie löse ich bei einem VIEW bei Änderungen ein NOTIFY aus? TRIGGER gehen, so wie ich es verstehe, nur bei TABLEs?

Hat da jemand eine Idee, vielleicht auch einen anderen Lösungsansatz?

NOTIFYs von den Basistabellen zu schicken, geht nicht, da sich der Satz der Basistabellen zur Laufzeit ändern kann, ohne dass das Frontend etwas davon erfährt.

Meinst du das als:

  • Wenn sich die Definition des View ändert?

Oder:

  • Wenn sich die Daten im View ändern?

Ein View ist ja quasi nur eine Abkürzung für eine Anfrage auf die eigentlichen Tabellen. Also musst du schon das Notify auf der Tabelle auslösen.

sowohl als auch

angenommen, erstmal wäre mein View eine Abfrage der Tabellen A Spalte 1, B Spalte 2 und C Spalte 3. Irgendwann zur Laufzeit ändert ein pgplsql Programm oder ein anderer Client die Definition des Views (REPLACE): jetzt ist es eine Abfrage der Tabellen E,F und G.

Das NOTIFY soll natürlich bei dem REPLACE gesendet werden, darüberhinaus aber auch, wenn sich irgendwas an den Daten der zugrundeliegenden Tabellen ändert. Dann möglichst sogar mit der Information, welche Zeile sich geändert hat…


Ich will versuchen, das durch etwas nähere Erklärung zu verdeutlichen:

in meiner Datenbank gibt es verschiedene Tabellen, in denen items verschiedenen Typs gespeichert sind. Gemeinsam haben sie aber alle eine Information id,x,y,rot,color (id ist global unique, da durch Sequenz erzeugt)
In meinem Qt Programm werden die auf einer Grafik dargestellt als Punkte eben mit x,y,rotation, color
Welche Punkte angezeigt werden sollen, wird durch extern bestimmt (anderer Client oder TRIGGER-Funktion, die ein REPLACE VIEW auslöst) Der VIEW ist damit einmal zB. ein SELECT id,x,y,rot,color FROM TabA UNION ALL SELECT id,x,y,rot,color FROM TabB , ein anderes Mal ein SELECT id,x,y,rot,color FROM TabC WHERE x<10 UNION ALL SELECT id,x,y,rot,color FROM TabD WHERE attributY=true oder was auch immer.
Natürlich ist ein Neuzeichnen der Grafik nötig, wenn die Definition des VIEW sich ändert. Aber eben auch, wenn sich eine Zeile im VIEW ändert, weil sich die Daten in der dazugehörigen Tabelle geändert haben.
Das Notify soll daher nicht von allen Tabellen kommen ungeachtet dessen, ob die Tabelle überhaupt dem VIEW momentan zugrundeliegt, soll auch nicht für jedes Objekt kommen, sondern nur für die die momentan im View angezeigt werden…
Und damit nicht ständig ALLES neu gezeichnet werden muss, möchte ich auch wissen, welche Zeile sich geändert hat…

Die Information über die Änderung des Views kannst du gar nicht erzeugen. Dafür wären Trigger auf Systemtabellen notwendig und die sind verboten.

Notify bei Änderungen sind möglich. Ab PG 9.0 kannst du sogar einen Payload mitschicken, der dann z. B. aus der geänderten ID bestehen kann.

“verboten=technisch unmöglich” oder “verboten=schlechter Stil” ?

vielleicht muss ich, um das zu verstehen, erstmal begreifen, wie das Datenbank-intern abläuft: kann mir jemand erklären, was genau passiert, wenn Daten in einer Tabelle sich ändern, die einem VIEW zugrundeliegt?

ja, aber leider nicht mit Qt empfangen, da Qt auch in der aktuellsten Version (4.7 beta) zwar auf Notifications subscriben kann, aber den payload nicht einliest…

Verboten im Sinne von: nicht zugelassen.
Wenn man einen Trigger auf eine Systemtabelle legen würde und dieser Trigger ist kaputt, kann man sich im schlimmsten Fall nicht mal mehr an der Datenbank anmelden.

Hmm, PG 9.0 ist ja auch noch nicht erschienen. Qt hat also noch etwas Zeit.
Alternativ kannst du einen Notify auslösen und speicherst die Informationen in einer Tabelle zwischen.