我已经在2个不同服务器的2个数据库中实现了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。
我想要实现的是一个主系统,如果一个系统宕机了,我可以在第二个系统中写,我真的不太关心,但考虑到当我要在服务器中恢复宕机的数据库时(可能使用pg-dump备份),我需要更新所有序列,以便从以前的位置开始写入。
发布于 2019-06-20 00:01:40
默认情况下,不在逻辑备用服务器上执行触发器,因为在应用更改时将参数session_replication_role设置为replica。
您可以更改触发器,使其即使在复制过程中也会触发:
ALTER TABLE mytab
ENABLE ALWAYS TRIGGER atrigger;发布于 2021-03-11 20:40:44
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,它就不能工作。我不知道为什么)
https://stackoverflow.com/questions/56671632
复制相似问题