我已经在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
的事实的一部分,为什么在第二个数据库中未触发该功能?
如果我在具有ID
3的DB1中插入一条记录,它会进行复制,而在DB2我具有相同的ID
的相同记录中,我将检查序列在DB2中仍然是1,而不是3。
现在,我将在DB2中插入一条记录,我有ID
2和4。
对于我想要实现的目标是一个主控主系统,如果一个主控系统崩溃了,我可以写第二个主控系统,我并不是很在乎,但是在发生灾难时要考虑在停机的服务器上恢复数据库(也许使用pg-dump备份),我需要更新所有序列以从以前的位置开始写入。
答案 0 :(得分:1)
默认情况下,触发器不会在逻辑备用服务器上执行,因为在应用更改后,参数session_replication_role
设置为replica
。
您可以更改触发器,以便即使在复制过程中也能触发它:
ALTER TABLE mytab
ENABLE ALWAYS TRIGGER atrigger;
答案 1 :(得分: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
,则它不起作用。我不知道为什么)))