PostgreSQL 10 逻辑复制触发器函数未执行

PostgreSQL 10 logical replication trigger function not executed

我已经在 2 个不同服务器的 2 db 内在 PostgreSQL 10 中实现了逻辑复制,我知道序列不同步所以我在两个数据库中都创建了这样的触发器函数:

CREATE FUNCTION update_ogc_fid()
    RETURNS trigger
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE NOT LEAKPROOF 
AS $BODY$
Declare 
iInt integer;
BEGIN
execute 'Select nextval('|| chr(39) || 'address_ogc_fid_seq' || chr(39) ||');' into iInt;
NEW.ogc_fid = iInt;
RETURN NEW;
END;
$BODY$;

CREATE TRIGGER update_ogc_fid_address
    BEFORE INSERT 
    ON address
    FOR EACH ROW
    EXECUTE PROCEDURE update_ogc_fid();

实际上在 DB1 中甚至在 DB2 中仅使用奇数 ID 的一部分为什么在第二个数据库中未触发该函数?

如果我在 DB1 中插入一条记录,我有 ID 3,它会进行复制,而在 DB2 中,我有相同的记录和相同的 ID,我要检查DB2 中的序列仍然是 1 而不是 3。

现在我要在 DB2 中插入一条记录,我有 ID 2,然后是 4。

对于我想要实现的是一个master master系统,万一一个挂了我可以写在第二个我真的不太在意但是我想万一发生灾难要在服务器中恢复已关闭的数据库(可能使用 pg-dump 备份)我需要更新所有序列以从之前的位置开始写入。

触发器默认不在逻辑备用服务器上执行,因为应用更改时参数 session_replication_role 设置为 replica

您可以更改触发器,使其即使在复制期间也会触发:

ALTER TABLE mytab
   ENABLE ALWAYS TRIGGER atrigger;
CREATE  TRIGGER yours_trigger_name
AFTER INSERT OR UPDATE ON yours_table_name
FOR EACH ROW
EXECUTE PROCEDURE yours_trigger_procedure_name();

alter table yours_table_name enable always trigger yours_trigger_name;
alter table yours_table_name enable replica trigger yours_trigger_name;

这个结构在复制中有效,但如果你想使用 UPDATE OF yours_field_name 而不是 UPDATE 它就不起作用。我不知道为什么)))