(Postgresql) make table trigger function insert更改行的ID值到日志表中,用于自定义复制

Posted

技术标签:

【中文标题】(Postgresql) make table trigger function insert更改行的ID值到日志表中,用于自定义复制【英文标题】:(Postgresql) make table trigger function insert ID value of changed row into log table, for custom replication 【发布时间】:2019-07-01 16:12:20 【问题描述】:

对于 Postgresql——最终是 Sybase ADS——我有可以使用自制触发器复制的表。触发器有一个函数应该记录 INSERT UPDATE DELETE 更改的信息,其中包括 I/U/D 操作和更改的行的 ID。我正在使用带有名字列和自动递增 ID 的测试表来测试双向复制。

如果我对 NAME 表进行插入操作,例如添加自动 ID 为“1”的“JOHN”,我是否能够将该 ID 值甚至“JOHN”插入到日志表中?我正在查看 OLD.ID 或 NEW.ID 选项,但我不知道它是否可以这样工作。我的触发器/功能代码是:

    CREATE OR REPLACE FUNCTION Insert() RETURNS TRIGGER AS $ReplInsert$
    BEGIN
        IF (TG_OP = 'DELETE') THEN
            INSERT INTO "log" ("Operation","ID","NAME")
    VALUES ('DELETE', OLD.ID, OLD.NAME);
            RETURN OLD;
        ELSIF (TG_OP = 'UPDATE') THEN
            INSERT INTO "log" ("Operation","ID","NAME")
    VALUES ('UPDATE', NEW.ID ,NEW.NAME);
            RETURN NEW;
        ELSIF (TG_OP = 'INSERT') THEN
            INSERT INTO "log" ("Operation","ID","NAME")
    VALUES ('UPDATE', NEW.ID , NEW.NAME);
            RETURN NEW;
        END IF;
        RETURN NULL; 
    END;
$ReplInsert$ LANGUAGE plpgsql;

CREATE TRIGGER logTrg
AFTER INSERT OR UPDATE OR DELETE ON "FIRST_NAME"
    FOR EACH ROW EXECUTE PROCEDURE Insert();

这最终是为了使用触发器进行双向复制。感谢您的任何考虑或指导。我会根据需要进行编辑。

【问题讨论】:

不要引用您要插入的旧值和新值。如果您将它们放在引号中,您实际上将插入“NEW.ID”字符串而不是新的 id。 @Nate 对不起,我的错字。编辑。我的代码在 NEW 和 OLD NAME 和 ID 值条目周围没有引号;只是操作值。我仍然收到错误:记录“新”没有我正在排除故障的字段“id”。谢谢。 【参考方案1】:

我能够通过将触发器中的 AFTER 更改为 BEFORE 来解决此问题,我起初认为这不起作用,或者:

    CREATE OR REPLACE FUNCTION Insert() RETURNS TRIGGER AS $ReplInsert$
    BEGIN
        IF (TG_OP = 'DELETE') THEN
            INSERT INTO "log" ("Operation","ID","NAME")
    VALUES ('DELETE', OLD.ID, OLD.NAME);
            RETURN OLD;
        ELSIF (TG_OP = 'UPDATE') THEN
            INSERT INTO "log" ("Operation","ID","NAME")
    VALUES ('UPDATE', NEW.ID ,NEW.NAME);
            RETURN NEW;
        ELSIF (TG_OP = 'INSERT') THEN
            INSERT INTO "log" ("Operation","ID","NAME")
    VALUES ('UPDATE', NEW.ID , NEW.NAME);
            RETURN NEW;
        END IF;
        RETURN NULL; 
    END;
$ReplInsert$ LANGUAGE plpgsql;

CREATE TRIGGER logTrg
BEFORE INSERT OR UPDATE OR DELETE ON "FIRST_NAME"
    FOR EACH ROW EXECUTE PROCEDURE Insert();

【讨论】:

以上是关于(Postgresql) make table trigger function insert更改行的ID值到日志表中,用于自定义复制的主要内容,如果未能解决你的问题,请参考以下文章

Rails/PostgreSQL:向文本添加字符限制

PostgreSQL:从另一个表插入

PostgreSQL - 查询表结构和索引信息

PostgreSQL - 查询表结构和索引信息

设置默认值时出现空约束错误 Ruby On Rails - Postgresql

在 postgresql 中找不到按级别连接的替代方法