use*_*332 5 postgresql logical-replication
我正在使用逻辑复制将数据从 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
Run Code Online (Sandbox Code Playgroud)
通知下游定义:
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
Run Code Online (Sandbox Code Playgroud)
使用日志记录,我能够证明这是在触发。我还可以看到有数据使用:
select pg_notification_queue_usage()
Run Code Online (Sandbox Code Playgroud)
问题是在我插入表中(读作:逻辑复制之外)以触发触发器之前,没有任何侦听器收到消息,然后侦听器收到通知应该从逻辑复制发送的所有消息。
所有这些都运行良好,直到我们转向逻辑复制(我们有一个已退役的本土解决方案,我对此一无所知)。
我没有收到任何可以给我任何线索的错误或奇怪的消息。我也打开了日志记录的详细程度,除了我添加到函数中以验证它们正在运行的日志语句之外,没有看到任何与 Notify 相关的内容。
Stack Overflow 上某人的另一份报告:Notify From Trigger On PG Logical Replicated Table
问题:我如何调试这个问题?如何让听众接收消息而不手动插入一行让它们突然出现?
更新:看起来这是PostgreSQL 10.4和至少11.4的一个错误。这里有一个实验性补丁。
看起来您可以更改表以始终触发触发器,包括通过执行以下操作进行复制(请参阅此处的文档):
ALTER TABLE my_table ENABLE ALWAYS TRIGGER my_trigger;
Run Code Online (Sandbox Code Playgroud)