【问题标题】:Trigger data changed of replicated table - postgres触发复制表的数据更改 - postgres
【发布时间】:2020-02-13 03:38:18
【问题描述】:

我有 2 个数据库,第一个是主数据库,第二个是副本数据库(只是一些主数据库表)。我尝试将副本表上的触发器添加到从主数据库表复制时捕获。

我使用触发器来捕获插入、删除和更新操作,但它似乎不起作用。该触发器仅适用于从 sql 语句更改的某些表。不适用于副本表。

有什么方法可以捕捉到副本表的变化?我使用 go lang 并遵循这篇文章的指南 https://coussej.github.io/2015/09/15/Listening-to-generic-JSON-notifications-from-PostgreSQL-in-Go/

我做了这些步骤:

-- create function
CREATE OR REPLACE FUNCTION notify_event() RETURNS TRIGGER AS $$
DECLARE
data json;
notification json;
BEGIN
IF (TG_OP = 'DELETE') THEN
data = row_to_json(OLD);
ELSE
data = row_to_json(NEW);
END IF;
notification = json_build_object(
'table',TG_TABLE_NAME,
'action', TG_OP,
'data', data);
PERFORM pg_notify('events',notification::text);
RETURN NULL;
END;
$$ LANGUAGE plpgsql;

-- create trigger
CREATE TRIGGER user_warehouse_notify_event
AFTER INSERT OR UPDATE OR DELETE ON users_warehouse_rel
FOR EACH ROW EXECUTE PROCEDURE notify_event();

-- enable replica trigger 
ALTER TABLE users_warehouse_rel ENABLE REPLICA TRIGGER user_warehouse_notify_event

还是不行

【问题讨论】:

    标签: postgresql triggers replication


    【解决方案1】:

    当逻辑复制应用其更改时,session_replication_role 设置为replica,因此不会触发正常触发器。

    要为您的触发器更改它,请使用

    ALTER TABLE atable ENABLE ALWAYS TRIGGER trigger_name;
    

    在使用之前三思而后行——定义不当的触发器会破坏复制。

    【讨论】:

    • OP,我想补充一点,如果您尝试在 master 上触发并发现它会产生过多的噪音或负载,而您现在正尝试在副本上触发而不是搞砸你的主人,这是行不通的,而且很可能会适得其反。
    • 什么意思? \d table_name 能得到什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    相关资源
    最近更新 更多