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