【问题标题】:Postgres triggers: write old record to new tablePostgres触发器:将旧记录写入新表
【发布时间】:2020-07-07 17:14:51
【问题描述】:

我有一组在 DELETE 上有触发器的不同表。我想将已删除的行写入不同架构上的类似表。

例如,假设我有几个不同的表:

CREATE TABLE A (val1 TEXT, val2 TEXT)
CREATE TABLE B (someval1 INT, someval2 TEXT, someval3 TEXT)

我在其他一些架构上有这些相同表的副本

CREATE SCHEMA backup;
CREATE TABLE backup.A (like A);
CREATE TABLE backup.B (like B);

每个非备份表 A & B 都有一个删除触发器(用 plpgsql 编写)。如果我从这些表中的任何一个表中删除一条记录,我该如何编写将删除的记录写入关联的备份表的触发器函数?

【问题讨论】:

    标签: sql postgresql plpgsql sql-delete database-trigger


    【解决方案1】:

    您确实可以使用触发器来做到这一点。每个表需要一个触发器,例如:

    create or replace function func_backup_tablea_before_delete()
    return trigger as
    $body$
    begin
        insert into backup.tablea(val1, val2) values (old.val1, old.val2);
    end;
    $body$ 
    
    create trigger trg_delete_a 
    before delete on tablea
    for each row
    execute procedure func_backup_tablea_before_delete;
    

    【讨论】:

    • 我正在寻找一种方法来为所有表使用一个函数,因为在我的实际情况下有多个表:(
    【解决方案2】:

    我能够使用单个非特定于表的触发器函数将删除的记录写入我的备份表:

    create or replace function track_delete() returns trigger as
    $body$
    BEGIN
        execute format('insert into backup.%I values($1.*)', tg_table_name) USING old;
    END;
    $body$
    language plpgsql;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-09
      • 1970-01-01
      • 2020-04-12
      • 1970-01-01
      • 2012-04-11
      • 2014-06-14
      • 2012-05-12
      相关资源
      最近更新 更多