使用postgresql审计表

时间:2016-12-12 19:19:17

标签: postgresql triggers

我想在postgresql中使用触发器执行审计表。

我的例子:

CREATE OR REPLACE FUNCTION fn_editorial_audit() 
RETURNS trigger AS $$
BEGIN
  IF (TG_OP = 'DELETE') THEN
    INSERT INTO eidt_aud ("code", "name","action","user_id","timestamp")
           VALUES (OLD, OLD, 'D', USER, now());
    RETURN OLD;
  ELSIF (TG_OP = 'UPDATE') THEN
    INSERT INTO eidt_aud ("code", "name","action","user_id","timestamp")
           VALUES (NEW, NEW, 'U', USER, now());
    RETURN NEW;
  ELSIF (TG_OP = 'INSERT') THEN
    INSERT INTO eidt_aud ("code", "name","action","user_id","timestamp")
           VALUES (NEW, NEW, 'I', USER, now());
    RETURN NEW;
  END IF;
  RETURN NULL;
END;

$$ LANGUAGE 'plpgsql'; ;

CREATE TRIGGER tb_editorial_tg_audit AFTER INSERT OR UPDATE OR DELETE
ON tb_edit FOR EACH ROW EXECUTE PROCEDURE fn_edit_audit();

但我想做一些不同的事情: 我想在原始编辑表的数据中插入数据表中的行(如果它不存在),并且如果它已经存在,则在审计表中更新。要始终拥有最后一个州而不是每个州。

谢谢!

1 个答案:

答案 0 :(得分:0)

那么为什么不将时间戳存储在实际的表本身上呢?

CREATE TABLE AS (... myAuditTimestamp timestamp);

或者,将列添加到预先存在的表

ALTER TABLE foo ADD COLUMN (myAuditTimestamp timestamp);

然后使用TRIGGERUPDATE时间戳字段。然后审计字段始终最新的行数据,因为它实际上在行上。如果您沿着这条路走下去,甚至不必创建PROCEDURE触发器来电,您可以使用SPI moddatetime()

  

F.34.5。 moddatetime - 跟踪上次修改时间的函数

     

moddatetime()是一个触发器,用于将当前时间存储到时间戳字段中。这对于跟踪表中特定行的最后修改时间非常有用。要使用,请使用此功能创建BEFORE UPDATE触发器。指定单个触发器参数:要修改的列的名称。该列必须是timestamp类型或带时区的时间戳。 moddatetime.example中有一个例子。