Realtime-Benachrichtigungen (SSE)
Realtime-Benachrichtigungen (SSE)
Abonnieren Sie PostgreSQL-NOTIFY-Kanäle über Server-Sent Events:
curl -N "http://localhost:8080/db/my_database/sse?channels=orders,users" \
-H "Authorization: Bearer $TOKEN"Jede Nachricht ist JSON mit Kanal und Payload:
{"channel":"orders","data":{"id":123,"status":"created"}}Wenn der Payload Text ist, wird er als String in data verpackt.
Kanäle sind nicht rollenbasiert eingeschränkt
Im Gegensatz zu den JSON-RPC- und MCP-Endpunkten wendet SSE kein SET LOCAL ROLE
an und prüft auch sonst nicht die Berechtigungen der authentifizierten Rolle vor dem Abonnieren.
PgArachne authentifiziert den Aufrufer (ein gültiges JWT, ein API-Token oder direkte Zugangsdaten für
die Zieldatenbank), aber jeder authentifizierte Aufrufer — unabhängig davon, welcher Rolle seine
Zugangsdaten zugeordnet sind — kann jeden beliebigen NOTIFY-Kanalnamen
abonnieren und erhält alles, was darauf veröffentlicht wird. Das ergibt sich aus dem Aufbau des
Endpunkts: Alle SSE-Clients einer Datenbank teilen sich eine einzige LISTEN-Verbindung,
die als DB_USER-Servicekonto geöffnet wird, und PostgreSQL selbst kennt kein
kanalbezogenes GRANT, an das delegiert werden könnte — LISTEN/NOTIFY-Kanäle
sind keine Datenbankobjekte.
Verschicken Sie über NOTIFY keine Payloads mit Daten, die nicht jede authentifizierte
Rolle sehen darf. Wenn Sie eine Zugriffskontrolle auf Kanalebene benötigen, setzen Sie diese in Ihrer
eigenen Anwendungslogik um (z. B. rollenbasierte Namenskonventionen für Kanäle oder Filterung des
Payload-Inhalts) — PgArachne übernimmt das auf diesem Endpunkt nicht für Sie.
Benachrichtigungen aus PostgreSQL senden
Aus psql oder einer beliebigen Datenbank-Session:
-- Einfacher Text-Payload
NOTIFY orders, 'neue Bestellung';
-- JSON-Payload
NOTIFY orders, '{"id":123,"status":"created"}';
Aus einem Trigger oder einer gespeicherten Prozedur:
PERFORM pg_notify('orders', json_build_object('id', NEW.id, 'status', NEW.status)::text);NOTIFY wird erst nach dem Commit der sendenden Transaktion an andere
Sessions zugestellt. Wenn Sie es innerhalb einer offenen Transaktion in psql ausführen,
erhalten Abonnenten die Nachricht erst nach COMMIT.