首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未执行PostgreSQL 10逻辑复制触发函数

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

Stack Overflow用户
提问于 2019-06-19 23:49:40
回答 2查看 1.6K关注 0票数 0

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

代码语言:javascript
复制
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备份),我需要更新所有序列,以便从以前的位置开始写入。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-20 00:01:40

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

您可以更改触发器,使其即使在复制过程中也会触发:

代码语言:javascript
复制
ALTER TABLE mytab
   ENABLE ALWAYS TRIGGER atrigger;
票数 2
EN

Stack Overflow用户

发布于 2021-03-11 20:40:44

代码语言:javascript
复制
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,它就不能工作。我不知道为什么)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56671632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档