0

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

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();

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

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

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

对于我想要实现的是一个主主系统,以防万一它出现故障,我可以在第二个中写我不太在意,但在我要恢复数据库时考虑以防万一发生灾难在已关闭的服务器中(可能带有 pg-dump 备份)我需要更新所有序列以从以前的位置开始写入。

4

2 回答 2

2

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

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

ALTER TABLE mytab
   ENABLE ALWAYS TRIGGER atrigger;
于 2019-06-19T16:01:40.413 回答
1
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它不起作用。我不知道为什么)))

于 2021-03-11T12:40:44.020 回答