Postgres Notify не работает с логической репликацией

Я реплицирую данные из Postgres 10.4 в другой экземпляр Postgres 10.4 с использованием логической репликации.

У подписчика есть несколько триггеров, которые регистрируют события в одной таблице. Эта таблица имеет триггер, который выполняет другую функцию (которая возвращает триггер) для вызова NOTIFY для нижестоящего слушателя.

Триггер на контрольной таблице выглядит так:

CREATE TRIGGER queue_insert
    AFTER INSERT ON schema_name.table_name FOR EACH ROW
     EXECUTE PROCEDURE notify_downstream()
GO

Уведомить нижестоящее определение:

CREATE OR REPLACE FUNCTION schema_name.notify_downstream () RETURNS trigger AS
'
declare
message character varying;
begin

raise log ''notify running!'';

message := ''
{ "id": 'edited for brevity' }

'';
execute ''notify chan_name, '''''' || message || '''''''';

raise log ''Value: %'', message;
return new;
end;
'
LANGUAGE 'plpgsql'
GO

Используя логирование, я могу доказать, что это стрельба. Я также вижу, что есть данные, использующие:

select pg_notification_queue_usage()

Проблема заключается в том, что ни один из слушателей не получает сообщение до тех пор, пока я не вставлю его в таблицу (читается как: вне логической репликации) для запуска триггера, а затем слушатель получит все сообщения, которые должны были быть отправлены уведомлением из логической репликации.

Все это работало хорошо, пока мы не перешли к логической репликации (у нас было собственное решение, которое было удалено, и я ничего не знаю об этом).

Я не получаю ошибок или странных сообщений, которые могут дать мне какие-либо подсказки. Я также рассказал подробности ведения журнала и не вижу ничего, связанного с Notify, кроме операторов журнала, которые я добавил в функции, чтобы убедиться, что они работают.

Другой отчет от кого-то о переполнении стека: Уведомление от триггера на логической реплицированной таблице PG

Вопрос: Как мне отладить эту проблему? Как заставить слушателей получать сообщения, не вставляя строку вручную, чтобы они появлялись внезапно?

1 ответ

Решение

Обновление: похоже, это ошибка в PostgreSQL 10.4. Здесь есть экспериментальный патч.


Согласно этому сообщению в списке рассылки PostgreSQL, похоже, что по умолчанию логическая репликация не вызовет срабатывания триггеров на репликах, поскольку таблицы обычно имеют роль "локальной" репликации, а в логических репликах данные вставляются с ролью "реплики".

Похоже, что вы можете изменить свою таблицу так, чтобы она всегда запускала триггеры, в том числе при репликации, выполнив следующие действия (см. Документацию здесь):

ALTER TABLE my_table ENABLE ALWAYS TRIGGER my_trigger;

Другие вопросы по тегам