0

设想:

我们有两个表,第一个调用 main_table。第二个调用查找表。我们需要通过 Postgres 内置逻辑复制从其他数据库实例复制 main_table。

同时,我们必须根据查找表过滤一些行。

我们为它创建一个触发器。

CREATE OR REPLACE FUNCTION record_filter() RETURNS trigger AS $$
DECLARE
    a_id integer;
BEGIN
    SELECT INTO a_id id from lookup_table where lookup_table.id = NEW.id;
 
    IF (a_id IS NOT NULL) AND (other logic) THEN
        RETURN NEW;
    END IF;
    RETURN null;   
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER record_update 
BEFORE INSERT OR UPDATE ON main_table 
FOR EACH ROW EXECUTE PROCEDURE record_filter();

ALTER TABLE main_table ENABLE ALWAYS TRIGGER record_update;

当我们从 psql shell 本地插入时。触发器被触发并按预期工作。但是,一旦我们打开逻辑复制。我们得到错误。

2021-09-29 04:28:21 UTC::@:[27535]:LOG: logical replication table synchronization worker for subscription "subscription_0", table "main_table" has started
2021-09-29 04:28:21 UTC::@:[27535]:ERROR: relation "lookup_table" does not exist at character 26
2021-09-29 04:28:21 UTC::@:[10813]:LOG: background worker "logical replication worker" (PID 27535) exited with exit code 1

想了解为什么?

4

0 回答 0