Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用PostgreSql触发器和过程审核/还原父子表_Sql_Postgresql_Parent Child_Audit - Fatal编程技术网

如何使用PostgreSql触发器和过程审核/还原父子表

如何使用PostgreSql触发器和过程审核/还原父子表,sql,postgresql,parent-child,audit,Sql,Postgresql,Parent Child,Audit,我们希望保留某些表的编辑历史记录,并在必要时恢复它们。例如,我们有以下表格。我们希望在执行插入/删除操作时审核emp表。除此之外,当版本字段发生更新时,我们还需要将相关emp_addr记录的副本保存到emp_addr_audit。当用户想要回滚到一个emp的特定版本时,我们需要从emp_audit和emp_addr_audit恢复记录 我正在考虑使用触发器进行审计工作,并使用程序进行恢复工作。我知道关键部分是如何在审计和恢复工作中维护父子表的完整性。我需要一些建议。谢谢 create tabl

我们希望保留某些表的编辑历史记录,并在必要时恢复它们。例如,我们有以下表格。我们希望在执行插入/删除操作时审核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),
);
我建议添加id字段作为审计表的主键,因为在回滚到
emp
表时需要引用该表,并且还需要
emp
引用相应版本的
emp\u 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
作为输入,并根据审计表恢复状态。最好在回滚之前保存状态,以防止可能的数据丢失


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

您必须要求任何回滚回滚从现在到该记录及其子记录的目标时间之间的所有更改,而不是直接还原目标记录。或者,您也可以编写审计记录,在每次父项或子项更改时复制父项及其所有子项(比如json符号)。这样,您就可以删除父级及其所有子级,然后从目标审核记录中还原它们?例如,如果我执行INSERT INTO table(id,column1,column2)值(1,'value1','value2')。然后,是否可以在审计表中使用触发器as:DELETE FROM table(其中id=1,column1='value1',column2='value2')自动生成undo sql语句