PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

select-Anweisung in der Postgres-Funktion, die in einem Trigger aufgerufen wird

So etwas?

CREATE FUNCTION notif()
RETURNS TRIGGER AS $$
DECLARE
    data JSONB;
    result JSONB;
BEGIN
    SELECT json_agg(tmp)  -- requires Postgres9.3+
    INTO data
    FROM (
        -- your subquery goes here, for example:
        SELECT followers.following_user_id
        FROM followers
        WHERE followers.followed_user_id = NEW.user_id
    ) tmp;

    result := json_build_object('data', data, 'row', row_to_json(NEW));
    PERFORM pg_notify('event', result::TEXT);
    RETURN NEW;
END;
$$ language plpgsql;

Auch aus Kommentaren:

Du missverstehst Dinge. Rückgabe und Benachrichtigung sind zwei verschiedene Dinge.

Beschäftigen wir uns zunächst mit der Rücksendung. Bei AFTER INSERT-Triggern wird der Rückgabewert vollständig ignoriert :

Der Rückgabewert spielt nur bei BEFORE-Triggern eine Rolle. In diesem Fall können Sie die Zeile ändern (oder sogar verhindern), bevor Sie in die Tabelle schreiben. Siehe dazu:https://www.postgresql.org/docs/9.2/ plpgsql-trigger.html Das hat nichts mit Benachrichtigungen zu tun.

Was ist also mit Benachrichtigungen? Was auch immer Sie von einer Benachrichtigung erhalten, übergeben Sie als zweites Argument an pg_notify . All das ist ziemlich gut dokumentiert:https://www.postgresql.org /docs/9.0/sql-notify.html