如何使用PostgreSql触发器和过程来审计/恢复父子表

时间:2014-03-20 20:38:07

标签: sql postgresql parent-child audit

我们希望保留某些表的编辑历史记录,并在必要时还原它们。例如,我们有以下表格。我们希望在执行插入/删除操作时审核emp表。除此之外,当版本字段更新发生时,我们还需要将相关emp_addr记录的副本保存到emp_addr_audit。当用户想要回滚到一个emp的特定版本时,我们需要从emp_audit和emp_addr_audit恢复记录。

我正在考虑使用触发器来执行审计工作以及执行还原工作的过程。我知道关键部分是如何在审计和恢复工作中维护父子表的完整性。我需要一些建议。谢谢。

 create table emp (
 emp_id integer primary key,
 version varchar(50)
);

/* Address table */    
create table emp_addr (
 addr_id integer primary key,
 emp_id integer, -- references table emp
 line1 varchar(30),

);

/* Audit table for emp table */    
create table emp_audit (
 operation   character(1),
 updatetime timestamp,
 emp_id integer,
 version varchar(50)

);

/* Audit table for emp_addr table */    
create table emp_addr_audit (
 operation   character(1),
 addr_id integer,
 emp_id integer,
 line1 varchar(30),
);

1 个答案:

答案 0 :(得分:1)

我建议将 id 字段作为主键添加到审核表中,因为在回滚到表时需要引用emp表您还需要emp来引用相应版本的emp_addr。 因此,审计表DDL应如下所示:

/* Audit table for emp table */    
create table emp_audit (
    id bigserial,
    operation   character(1),
    updatetime timestamp,
    emp_id integer,
    version varchar(50),
    CONSTRAINT audit_emp_id PRIMARY KEY (id)
);

/* Audit table for emp_addr table */    
create table emp_addr_audit (
    id bigserial,
    operation   character(1),
    addr_id integer,
    emp_id integer,
    line1 varchar(30),
    CONSTRAINT fk_  audit_emp_id FOREIGN KEY emp_audit_id
       REFERENCES emp_audit (id) MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE;
);

接下来,您需要创建一个触发器来存储更改。请注意,您必须监视两个表中的更改并创建对相应存储记录的引用。

CREATE TRIGGER t_audit_emp_IUD
    AFTER INSERT OR UPDATE OR DELETE -- probably u want only update. Not sure
    ON emp
    FOR EACH ROW
    EXECUTE PROCEDURE emp_modified();

CREATE TRIGGER t_audit_emp_addr_IUD
    AFTER INSERT OR UPDATE OR DELETE 
    ON emp_addr
    FOR EACH ROW
    EXECUTE PROCEDURE emp_addr_modified();

最后定义函数。注意,函数应该在触发器之前存储在数据库中,因为触发器引用了函数。

回滚功能应将emp_audit.id作为输入,并根据审计表恢复状态。在回滚之前保存状态以防止可能的数据丢失是个好主意。

如果这不能回答您的问题,请说明您实际需要帮助的部分。