postgres build json объект с необязательной парой ключ-значение - PullRequest
0 голосов
/ 15 апреля 2020

Ниже я реализовал простую функцию триггера уведомления postgres, которая публикует запись OLD и NEW как пользовательский объект json после транзакции insert или update.

CREATE OR REPLACE FUNCTION test() 
    RETURNS trigger AS
$BODY$
    BEGIN
        PERFORM pg_notify('test_chanel', json_build_object('new',row_to_json(NEW),'old',row_to_json(OLD))::text );
        RETURN NULL;
    END;
$BODY$
    LANGUAGE plpgsql VOLATILE
    COST 100;

должен испускать

{
   "old":{...},
   "new":{...}
}

Проблема в том, что OLD явно не существует для insert. Как я могу сделать это по желанию?

1 Ответ

0 голосов
/ 15 апреля 2020

Вы можете использовать автоматические c переменные TG_OP внутри триггера. С этой переменной ваш код должен выглядеть так:

BEGIN
  IF TG_OP = 'INSERT' THEN
    PERFORM pg_notify('test_chanel', json_build_object('new',row_to_json(NEW));
  ELSEIF TG_OP = 'UPDATE' THEN
    PERFORM pg_notify('test_chanel', json_build_object('new',row_to_json(NEW),'old',row_to_json(OLD))::text );
  ELSE
    PERFORM pg_notify('test_chanel', json_build_object(row_to_json(OLD))::text );
  END IF;
END;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...