DB-Server Events in PG?

Moin,

In Oracle gibt es Alerts
In MySQL 5.1 gibts nun Events

Und gibt es etwas equivalentes für Postgres?

Funktionsweise:
Ein Oracle Alert prüft ob eine bestimmte Bedingung in einer Tabelle erreicht ist, als Konsequenz erhält man so etwas wie eine Exception auf die das Client
Programm reagieren muss. Besonders sinnvoll z.B wenn man dauerhaftes
Pollen durch periodische SELECT’s vermeiden möchte, nur um heraus zu finden
das sich ein Wert verändert hat.

Wenn es das nicht gibt, kann ich dann mit pg/plSQL dann eine eigene Exception Art definieren die z.B mittels Rule oder Trigger bei erreichen eines
bestimmten Zustands in einer Tabelle eine Exception an den Client schickt?

Dann wüsste der Client das definitiv zu verarbeitende Daten vorliegen und
diese nun bearbeitet werden müssen. Der Client an dieser Stelle ist ein
C/C++ System Deamon der permanent mit der DB via Unix Socket connectiert
ist.

Falls das alles nicht möglich ist, wie schauts im Falle einer UDF aus, bietet
das mehr Spielraum?

Gruß Marc

Nein, PostgreSQL bietet (leider) nichts vergleichbares.
Trigger gibt es nur für INSERT, UPDATE und DELETE.

Ähm. LISTEN / NOTIFY. Damit kann der Server auch einen (lauschenden) Client informieren.

Andreas

Die Events werden aber nicht von der Datenbank selbst ausgelöst sondern von anderen Clients.

Ich zitiere mal aus der originalen Frage:

Funktionsweise:
Ein Oracle Alert prüft ob eine bestimmte Bedingung in einer Tabelle erreicht ist, als Konsequenz erhält man so etwas wie eine Exception auf die das Client
Programm reagieren muss. Besonders sinnvoll z.B wenn man dauerhaftes
Pollen durch periodische SELECT’s vermeiden möchte, nur um heraus zu finden
das sich ein Wert verändert hat.

Andreas

Ja, und? Dafür muss in PostgreSQL ein Trigger das Event auslösen. Und Events (also Trigger) auf Systemereignisse gibt es gar nicht.

Ich hab in der Frage nichts von der Notwendigkeit von Triggern auf Systemtabellen oder so gelesen, sondern nur, daß ein Client benachrichtigt werden soll, wenn sich z.B. der Inhalt einer Tabelle geändert hat. Die Doku meint dazu:

When NOTIFY is used to signal the occurrence of changes to a particular table, a useful programming technique is to put the NOTIFY in a rule that is triggered by table updates. In this way, notification happens automatically when the table is changed, ...

und das klingt mir zumindest doch nach dem, was der Fragesteller sucht.

Andreas

Wenn du nur Änderungen an Tabellen verfolgen willst, dann ist LISTEN/NOTIFY der gängige Weg, ja.

Ich hatte das als “Systemevents” interpretiert und dafür gibt es (leider) nichts.

Ja, Listen/Notify ist genau das was ich gesucht habe.
Jetzt kann ich endlich ohne dauerndes Pollen wissen was zu verarbeitende
Daten in den Tabellen sind und mein Programm weiß wann es aktiv
werden soll. Jetzt ist natürlich nur noch die Frage wie das Clientprogramm
die Nachricht erhält, z.B als Exception. Wäre ja doof wenn ich statt der
Polls auf die Tabelle via Select nun dauernd Polls auf eine virtuelle Eventtablle
fahren muss. Ein Event das als Exception reinkommt wäre mir da wesentlich
lieber.

Das wird als Signal auf die aktive Datenbankverbindung gesandt. Allerdings ist es von Anwendung zu Anwendung und von Programmiersprache zu Sprache unterschiedlich, wie das ausgewertet wird.

Das war mir schon klar das es ein Signal ist das an den Client geschickt
wird. Nur ist es ja nicht ganz trivial auf welche Art und Weise z.B Java
im Context von JDBC damit umgeht. Was ich jetzt gelesen habe war, das man
es mit der JDBC Methode getWarnings() abfragen kann, da kommt dann ein
bestimmter Text Wert zurück. Um aber zu sehen ob getWarnings was gemeldet
hat, muss man es ja ständig auswerten und vermutlich kommt nicht nur
eine Warning sondern multiple. Ich vermute da muss ich wohl einen Bereitschaftsthread laufen lassen, der sobald die Clientconnections steht
die Events abhört. Listen/Notify kommt mir da sehr zu pass, da ich nun
endlich in der Message Inbox meiner WebApp die neue Post ohne Polls
darstellen kann.

von client zu client kommunikation wuerde ich in PG einfach Locks auf einer dafuer vorgesehenen Event-Table missbrauchen … “Event” ist doch nur schall und rauch :slight_smile:

Nein Du hast es nicht verstanden!
Ein Event in Postgres schickt eine Benachrichtigung ohne Pull an z.B das via JDBC angeschlossene Java Programm in Form einer Warning die Du mit getWarnings() abfangen kannst (z.B mittels Background Thread in folgender Form:

if (!(getWarnings().equals(“Mein registriertes Event”))) {
System.out.println(“Neue Daten in Tabelle erkannt, starte Verarbeitung…”);

/* ohne check - if exists? */
this.ladeNeueBestellungen();
}

Du musst also nicht periodisch ein SELECT XYZ abfeuern ob sich in einer Tabelle was getan hat, sondern die DB meldet sich bei deinem Programm.

Nein - Du hast nicht verstanden - wie man “technologieneutral” das Problem auch lösen könnte.

Nein, Du hast nicht verstanden das Postgres Events und Postgres
Trigger einfach zwei verschiedene Paar Schuhe sind. Ich habe den Thread
in einem Postgres Forum für Postgres gestellt und explizit nach Events
gefragt, wie Du da auf Trigger oder Technologieneutral kommst weißt wohl
nur Du. Darüber hinaus ist deine Vorschlag noch völlig ungeeignet.

Vergib ihm und schau einfach auf seine anderen Postings.
So etwas kommt häufiger vor …

wer redet denn von Triggern?

ohje

ich empfehle LESEN … schauen reicht offensichtlich nicht

Nun denn - ich vergebe Dir

Ich lese das jetzt nicht alles Du oller Backfisch, meine Dioptrien müssten aber ganz sicher mal wieder neu eingestellt werden :slight_smile: Von mir aus haste recht und ads
die Ruhe weg.