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
它就不起作用。我不知道为什么)))
我已经在 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
它就不起作用。我不知道为什么)))