用于捕获表格数据的通用触发器,用于postgres中的审计

时间:2018-03-26 15:06:13

标签: postgresql postgresql-9.3

需要帮助来创建记录所有表的通用触发器。

我有一个名为“system”的表,需要记录它。

创建日志表名称system_audit,其中包含“system”表的所有列以及另外三列名称 modified_dt,modified_by和modified_type。

modified_dt将是current_timestamp modified_by将是用户 和modified_type指定是插入,更新还是删除。(需要捕获插入/更新的新数据和旧的删除数据)

如何编写函数来捕获上述数据。它也需要是动态的,所以我可以在我的架构中的所有表中使用它

注意:所有审计表都包含modified_dt,modified_by和modified_type为必填项。

我从网上获得了一些代码,但它无法正常工作,我之前正在使用oracle,并且刚接触到postgres,不确定如何正确编码。请帮助

1 个答案:

答案 0 :(得分:1)

我设法创建了一个通用函数,并且它工作正常。感谢您的帮助。

create or replace function audit.fn__audit()
    returns trigger as 
    $func$
    declare
    col_name  text:='';
    audit_table_name text := TG_TABLE_NAME || '_audit';
    begin
     if TG_OP = 'UPDATE' or TG_OP = 'INSERT' THEN 
    EXECUTE format('INSERT INTO audit.%1$I  SELECT ($1).*,current_timestamp,user,'''||TG_OP||'''',audit_table_name) using NEW;
    else 
    EXECUTE format('INSERT INTO audit.%1$I  SELECT ($1).*,current_timestamp,user,'''||TG_OP||'''',audit_table_name) using old;
     end if;
    return new;
    END $func$ 
    LANGUAGE plpgsql VOLATILE;